You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

37 lines
1.1 KiB

4 days ago
  1. package com.example.demo.Util;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.StringRedisTemplate;
  4. import org.springframework.stereotype.Component;
  5. import java.util.concurrent.TimeUnit;
  6. @Component
  7. public class RedisLockUtil {
  8. @Autowired
  9. private StringRedisTemplate redisTemplate;
  10. /**
  11. * 尝试获取分布式锁
  12. * @param lockKey 锁的 Key
  13. * @param requestId 请求 ID可用 UUID
  14. * @param expireTime 锁的过期时间毫秒
  15. * @return 是否获取成功
  16. */
  17. public boolean tryLock(String lockKey, String requestId, long expireTime) {
  18. return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.MILLISECONDS);
  19. }
  20. /**
  21. * 释放分布式锁
  22. * @param lockKey 锁的 Key
  23. * @param requestId 请求 ID
  24. */
  25. public void unlock(String lockKey, String requestId) {
  26. String currentValue = redisTemplate.opsForValue().get(lockKey);
  27. if (requestId.equals(currentValue)) {
  28. redisTemplate.delete(lockKey);
  29. }
  30. }
  31. }