From f45b50a796e1db1238b1147f11c2f96c0d405e48 Mon Sep 17 00:00:00 2001
From: sxq <812980466@qq.com>
Date: 星期三, 09 六月 2021 23:30:46 +0800
Subject: [PATCH] update redis锁工具类编写
---
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java | 132 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 132 insertions(+), 0 deletions(-)
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java
new file mode 100644
index 0000000..fb665a9
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java
@@ -0,0 +1,132 @@
+package com.ruoyi.common.core.redis;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import org.redisson.api.RCountDownLatch;
+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 閿佺鐞嗙被
+ *
+ * @author shenxinquan
+ */
+@Component
+public class RedisLockManager {
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ private final ThreadLocal<RLock> threadLocal = new ThreadLocal<>();
+
+ /**
+ * 鑾峰彇閿侊紙涓嶇敤璁剧疆瓒呮椂鏃堕棿锛屼竴鐩寸瓑寰咃級
+ */
+ public boolean getLock(String key) {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ RLock lock = redissonClient.getLock(key);
+ threadLocal.set(lock);
+ return lock.tryLock();
+ }
+
+ /**
+ * 璁剧疆杩囨湡鏃堕棿
+ *
+ * @param key
+ * @param time 杩囨湡鏃堕棿
+ * @param expireUnit 鏃堕棿鍗曚綅
+ */
+ public boolean getLock(String key, long time, TimeUnit expireUnit) throws InterruptedException {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ Assert.isTrue(time > 0, "杩囨湡鏃堕棿蹇呴』澶т簬0");
+ Assert.isTrue(Validator.isNotEmpty(expireUnit), "鏃堕棿鍗曚綅涓嶈兘涓虹┖");
+ RLock lock = redissonClient.getLock(key);
+ threadLocal.set(lock);
+ return lock.tryLock(time, expireUnit);
+ }
+
+ /**
+ * 璁剧疆杩囨湡鏃堕棿
+ *
+ * @param key
+ * @param waitTime 鑾峰彇閿佺瓑寰呮椂闂�
+ * @param leaseTime 淇濈暀閿佺殑鏃堕棿
+ * @param expireUnit 鏃堕棿鍗曚綅
+ * @throws InterruptedException
+ */
+ public boolean getLock(String key, long waitTime, long leaseTime, TimeUnit expireUnit) throws InterruptedException {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ Assert.isTrue(waitTime > 0, "鑾峰彇閿佺瓑寰呮椂闂村繀椤诲ぇ浜�0");
+ Assert.isTrue(leaseTime > 0, "淇濈暀閿佺殑鏃堕棿蹇呴』澶т簬0");
+ Assert.isTrue(Validator.isNotEmpty(expireUnit), "鏃堕棿鍗曚綅涓嶈兘涓虹┖");
+ RLock lock = redissonClient.getLock(key);
+ threadLocal.set(lock);
+ return lock.tryLock(waitTime, leaseTime, expireUnit);
+ }
+
+ /**
+ * 鑾峰彇璁℃暟鍣ㄩ攣
+ *
+ * @param key
+ * @param count countDownLatch 鐨勬暟閲�
+ */
+ public RCountDownLatch countDownLatch(String key, long count) {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ Assert.isTrue(count >= 0, "count鏁伴噺蹇呴』澶т簬绛変簬0");
+ RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch(key);
+ rCountDownLatch.trySetCount(count);
+ return rCountDownLatch;
+ }
+
+ /**
+ * 鑾峰彇鍏钩閿�
+ *
+ * @param key
+ * @param waitTime 鑾峰彇閿佺瓑寰呮椂闂�
+ * @param leaseTime 鎸佹湁閿佺殑鏃堕棿
+ * @param expireUnit 鏃堕棿鍗曚綅
+ * @return
+ * @throws InterruptedException
+ */
+ public boolean getFairLock(String key, long waitTime, long leaseTime, TimeUnit expireUnit) throws InterruptedException {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ Assert.isTrue(waitTime > 0, "鑾峰彇閿佺瓑寰呮椂闂村繀椤诲ぇ浜�0");
+ Assert.isTrue(leaseTime > 0, "淇濈暀閿佺殑鏃堕棿蹇呴』澶т簬0");
+ Assert.isTrue(Validator.isNotEmpty(expireUnit), "鏃堕棿鍗曚綅涓嶈兘涓虹┖");
+ RLock lock = redissonClient.getFairLock(key);
+ threadLocal.set(lock);
+ return lock.tryLock(waitTime, leaseTime, expireUnit);
+ }
+
+ /**
+ * 鑾峰彇鍏钩閿�
+ *
+ * @param key
+ * @param leaseTime 鎸佹湁閿佺殑鏃堕棿
+ * @param expireUnit 鏃堕棿鍗曚綅
+ * @return
+ * @throws InterruptedException
+ */
+ public boolean getFairLock(String key, long leaseTime, TimeUnit expireUnit) throws InterruptedException {
+ Assert.isTrue(StrUtil.isNotBlank(key), "key涓嶈兘涓虹┖");
+ Assert.isTrue(leaseTime > 0, "淇濈暀閿佺殑鏃堕棿蹇呴』澶т簬0");
+ Assert.isTrue(Validator.isNotEmpty(expireUnit), "鏃堕棿鍗曚綅涓嶈兘涓虹┖");
+ RLock lock = redissonClient.getFairLock(key);
+ threadLocal.set(lock);
+ return lock.tryLock(leaseTime, expireUnit);
+ }
+
+ /**
+ * 閲婃斁閿�(缁熶竴閲婃斁)
+ */
+ public void unLock() {
+ RLock lock = threadLocal.get();
+ lock.unlock();
+ threadLocal.remove();
+ }
+}
--
Gitblit v1.9.3