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