소스 검색

分布式锁相关

cup 2 년 전
부모
커밋
c330258ea7

+ 7 - 0
mp-common/pom.xml

@@ -22,6 +22,13 @@
 
     <dependencies>
 
+        <!-- redisson -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.16.8</version>
+        </dependency>
+
         <!-- swagger 增强-->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>

+ 29 - 0
mp-common/src/main/java/com/qs/mp/common/core/redis/DistributedLocker.java

@@ -0,0 +1,29 @@
+package com.qs.mp.common.core.redis;
+
+import org.redisson.api.RLock;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Cup
+ * @date 2022/5/18
+ */
+public interface DistributedLocker {
+
+    RLock lock(String lockKey);
+
+    RLock lock(String lockKey, long leaseTime);
+
+    RLock lock(String lockKey, long leaseTime, TimeUnit unit);
+
+    RLock getLock(String lockKey);
+
+    boolean tryLock(String lockKey);
+
+    boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit);
+
+    void unlock(String lockKey);
+
+    void unlock(RLock lock);
+
+}

+ 76 - 0
mp-common/src/main/java/com/qs/mp/common/core/redis/RedissonDistributedLocker.java

@@ -0,0 +1,76 @@
+package com.qs.mp.common.core.redis;
+
+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;
+
+/**
+ * @author Cup
+ * @date 2022/5/18
+ */
+@Component
+public class RedissonDistributedLocker implements DistributedLocker {
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Override
+    public RLock lock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock();
+        return lock;
+    }
+
+    @Override
+    public RLock lock(String lockKey, long leaseTime) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock(leaseTime, TimeUnit.SECONDS);
+        return lock;
+    }
+
+    @Override
+    public RLock lock(String lockKey, long leaseTime, TimeUnit unit) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock(leaseTime, unit);
+        return lock;
+    }
+
+    @Override
+    public RLock getLock(String lockKey) {
+        return redissonClient.getLock(lockKey);
+    }
+
+    @Override
+    public boolean tryLock(String lockKey) {
+        // -1则会自动续期
+        return tryLock(lockKey, 10, -1, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit) {
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            return lock.tryLock(waitTime, leaseTime, unit);
+        } catch (InterruptedException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public void unlock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        if(lock.isLocked()){
+            lock.unlock();
+        }
+    }
+
+    @Override
+    public void unlock(RLock lock) {
+        if(lock.isLocked()) {
+            lock.unlock();
+        }
+    }
+}