|
@@ -0,0 +1,60 @@
|
|
|
+package com.fdkankan.redis.util;
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 分布式Redis锁
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class RedissonLock {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+
|
|
|
+ // 加锁
|
|
|
+ public Boolean lock(String lockName) {
|
|
|
+ if (redissonClient == null) {
|
|
|
+ log.info("DistributedRedisLock redissonClient is null");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ RLock lock = redissonClient.getLock(lockName);
|
|
|
+ // 锁15秒后自动释放,防止死锁
|
|
|
+ lock.lock(15, TimeUnit.SECONDS);
|
|
|
+
|
|
|
+ log.info("Thread [{}] DistributedRedisLock lock [{}] success", Thread.currentThread().getName(), lockName);
|
|
|
+ // 加锁成功
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("DistributedRedisLock lock [{}] Exception:", lockName, e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 释放锁
|
|
|
+ public Boolean unlock(String lockName) {
|
|
|
+ if (redissonClient == null) {
|
|
|
+ log.info("DistributedRedisLock redissonClient is null");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ RLock lock = redissonClient.getLock(lockName);
|
|
|
+ lock.unlock();
|
|
|
+ log.info("Thread [{}] DistributedRedisLock unlock [{}] success", Thread.currentThread().getName(), lockName);
|
|
|
+ // 释放锁成功
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("DistributedRedisLock unlock [{}] Exception:", lockName, e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|