From dcf125a08ad3f0694815265850df78d62f1444fa Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期五, 04 六月 2021 16:09:43 +0800
Subject: [PATCH] update 优化 redis锁pr 代码
---
/dev/null | 64 ----------------
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java | 89 ++++++++++++++++-----
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java | 8 +-
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java | 35 ++++++++
4 files changed, 105 insertions(+), 91 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RedisLockController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RedisLockController.java
deleted file mode 100644
index 28102d0..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RedisLockController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.ruoyi.web.controller.system;
-
-import com.ruoyi.common.annotation.RedisLock;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.model.LoginBody;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.framework.web.service.TokenService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-
-/**
- * 娴嬭瘯鍒嗗竷寮忛攣鐨勬牱渚�
- */
-@RestController
-@RequestMapping("/system/redisLock")
-public class RedisLockController {
-
- @Autowired
- private TokenService tokenService;
-
- /**
- * #p0 鏍囪瘑鍙栫涓�涓弬鏁颁负redis閿佺殑key
- * @param loginBody
- * @return
- */
- @GetMapping("/getLock")
- @RedisLock(expireTime=10,key = "#p0")
- public AjaxResult getInfo(@RequestBody LoginBody loginBody){
- LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
- SysUser user = loginUser.getUser();
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return AjaxResult.success(user);
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
index e84f5c8..7b3c912 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
@@ -7,6 +7,8 @@
/**
* 鍒嗗竷寮忛攣锛堟敞瑙fā寮忥紝涓嶆帹鑽愪娇鐢紝鏈�濂界敤閿佺殑宸ュ叿绫伙級
+ *
+ * @author shenxinquan
*/
@Target({ElementType.METHOD})
@@ -14,14 +16,12 @@
public @interface RedisLock {
/**
- * 閿佽繃鏈熸椂闂�
- * @return
+ * 閿佽繃鏈熸椂闂� 榛樿30绉�
*/
- int expireTime() default 30;//30绉�
+ int expireTime() default 30;
/**
* 閿乲ey鍊�
- * @return
*/
String key() default "redisLockKey";
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockUtil.java
deleted file mode 100644
index 6dc6591..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockUtil.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.ruoyi.common.core.redis;
-
-
-import org.redisson.api.RLock;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-@Component
-public class RedisLockUtil {
-
- @Autowired
- private RedissonClient redissonClient;
-
- private static final String LOCK_TITLE = "redisLock_";
-
- private static final Logger log = LoggerFactory.getLogger(RedisLockUtil.class);
-
-/* public boolean getLock(String key){
- key = LOCK_TITLE + key;
- RLock mylock = redissonClient.getLock(key);
- System.err.println("======lock======" + Thread.currentThread().getName());
- return true;
- }*/
-
- /**
- * 鍔犻攣 锛圧Lock锛夊甫瓒呮椂鏃堕棿鐨�
- * @param key
- * @param expire
- * @param expireUnit
- * @return
- */
- public boolean acquire(String key, long expire, TimeUnit expireUnit) {
- //澹版槑key瀵硅薄
- key = LOCK_TITLE + key;
- //鑾峰彇閿佸璞�
- RLock mylock = redissonClient.getLock(key);
- //鍔犻攣锛屽苟涓旇缃攣杩囨湡鏃堕棿锛岄槻姝㈡閿佺殑浜х敓
- try {
- mylock.tryLock(expire,expire,expireUnit);
- } catch (InterruptedException e) {
- e.getMessage();
- return false;
- }
- System.err.println("======lock======" + Thread.currentThread().getName());
- //鍔犻攣鎴愬姛
- return true;
- }
- //閿佺殑閲婃斁
- public void release(String lockName) {
- //蹇呴』鏄拰鍔犻攣鏃剁殑鍚屼竴涓猭ey
- String key = LOCK_TITLE + lockName;
- //鑾峰彇鎵�瀵硅薄
- RLock mylock = redissonClient.getLock(key);
- //閲婃斁閿侊紙瑙i攣锛�
- mylock.unlock();
- System.err.println("======unlock======" + Thread.currentThread().getName());
- }
-
-}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
new file mode 100644
index 0000000..7792784
--- /dev/null
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
@@ -0,0 +1,35 @@
+package com.ruoyi.demo.controller;
+
+import com.ruoyi.common.annotation.RedisLock;
+import com.ruoyi.common.core.domain.AjaxResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 娴嬭瘯鍒嗗竷寮忛攣鐨勬牱渚�
+ *
+ * @author shenxinquan
+ */
+@RestController
+@RequestMapping("/demo/redisLock")
+public class RedisLockController {
+
+ /**
+ * #p0 鏍囪瘑鍙栫涓�涓弬鏁颁负redis閿佺殑key
+ */
+ @GetMapping("/getLock")
+ @RedisLock(expireTime = 10, key = "#p0")
+ public AjaxResult<String> getLock(String key, String value) {
+ try {
+ // 鍚屾椂璇锋眰鎺掗槦
+// Thread.sleep(5000);
+ // 閿佽秴鏃舵祴璇�
+ Thread.sleep(11000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return AjaxResult.success("鎿嶄綔鎴愬姛",value);
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
similarity index 61%
rename from ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockAspect.java
rename to ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
index c249dfe..0ff695f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
@@ -1,15 +1,15 @@
-package com.ruoyi.common.core.redis;
+package com.ruoyi.framework.aspectj;
import com.ruoyi.common.annotation.RedisLock;
-import com.ruoyi.common.utils.file.ImageUtils;
+import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@@ -21,15 +21,20 @@
/**
* 鍒嗗竷寮忛攣锛堟敞瑙e疄鐜扮増鏈級
+ *
+ * @author shenxinquan
*/
-@Component
+
+@Slf4j
@Aspect
@Order(9)
+@Component
public class RedisLockAspect {
- @Autowired
- private RedisLockUtil redisUtil;
- private static final Logger log = LoggerFactory.getLogger(RedisLockAspect.class);
+ @Autowired
+ private RedissonClient redissonClient;
+
+ private static final String LOCK_TITLE = "RedisLock_";
@Pointcut("@annotation(com.ruoyi.common.annotation.RedisLock)")
public void annotationPointcut() {
@@ -47,6 +52,7 @@
String key = "";
// 榛樿30绉掕繃鏈熸椂闂�
int expireTime = 30;
+
try {
// 寰楀埌璁块棶鐨勬柟娉曞璞�
Method method = className.getMethod(methodName, argClass);
@@ -60,18 +66,26 @@
} catch (Exception e) {
throw new RuntimeException("redis鍒嗗竷寮忛攣娉ㄨВ鍙傛暟寮傚父", e);
}
- Object res = new Object();
- if (redisUtil.acquire(key, expireTime, TimeUnit.SECONDS)) {
- try {
- res = joinPoint.proceed();
- return res;
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- redisUtil.release(key);
+
+ Object res;
+ try {
+ if (acquire(key, expireTime, TimeUnit.SECONDS)) {
+ try {
+ res = joinPoint.proceed();
+ return res;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ release(key);
+ }
+ } else {
+ throw new RuntimeException("redis鍒嗗竷寮忛攣娉ㄨВ鍙傛暟寮傚父");
}
- }else {
- throw new RuntimeException("redis鍒嗗竷寮忛攣娉ㄨВ鍙傛暟寮傚父");
+ } catch (IllegalMonitorStateException e) {
+ log.error("lock timeout => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
+ throw new RuntimeException("lock timeout => key : " + key);
+ } catch (Exception e) {
+ throw new Exception("redis鍒嗗竷寮忔湭鐭ュ紓甯�", e);
}
}
@@ -95,9 +109,6 @@
/**
* 鑾峰彇key涓�#p0涓殑鍙傛暟鍚嶇О
- *
- * @param key
- * @return
*/
private static List<String> getKeyParsList(String key) {
List<String> listPar = new ArrayList<>();
@@ -107,7 +118,7 @@
String parName;
int indexPre = key.indexOf("#");
if (plusIndex > 0) {
- indexNext = key.indexOf("#") + key.substring(key.indexOf("#")).indexOf("+");
+ indexNext = key.indexOf("#") + plusIndex;
parName = key.substring(indexPre, indexNext);
} else {
parName = key.substring(indexPre);
@@ -121,4 +132,36 @@
return listPar;
}
+ /**
+ * 鍔犻攣锛圧Lock锛夊甫瓒呮椂鏃堕棿鐨�
+ */
+ private boolean acquire(String key, long expire, TimeUnit expireUnit) {
+ //澹版槑key瀵硅薄
+ key = LOCK_TITLE + key;
+ try {
+ //鑾峰彇閿佸璞�
+ RLock mylock = redissonClient.getLock(key);
+ //鍔犻攣锛屽苟涓旇缃攣杩囨湡鏃堕棿锛岄槻姝㈡閿佺殑浜х敓
+ mylock.tryLock(expire, expire, expireUnit);
+ } catch (InterruptedException e) {
+ return false;
+ }
+ log.info("lock => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
+ //鍔犻攣鎴愬姛
+ return true;
+ }
+
+ /**
+ * 閿佺殑閲婃斁
+ */
+ private void release(String lockName) {
+ //蹇呴』鏄拰鍔犻攣鏃剁殑鍚屼竴涓猭ey
+ String key = LOCK_TITLE + lockName;
+ //鑾峰彇鎵�瀵硅薄
+ RLock mylock = redissonClient.getLock(key);
+ //閲婃斁閿侊紙瑙i攣锛�
+ mylock.unlock();
+ log.info("unlock => key : " + key + " , ThreadName : " + Thread.currentThread().getName());
+ }
+
}
--
Gitblit v1.9.3