pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -30,6 +30,7 @@ <feign-okhttp.version>11.0</feign-okhttp.version> <spring-boot-admin.version>2.4.1</spring-boot-admin.version> <redisson.version>3.15.2</redisson.version> <lock4j.version>2.2.1</lock4j.version> <datasource.version>3.4.0</datasource.version> </properties> @@ -133,7 +134,11 @@ <artifactId>redisson-spring-boot-starter</artifactId> <version>${redisson.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>lock4j-redisson-spring-boot-starter</artifactId> <version>${lock4j.version}</version> </dependency> <!-- 宿¶ä»»å¡--> <dependency> <groupId>com.ruoyi</groupId> ruoyi-common/pom.xml
@@ -152,6 +152,11 @@ <artifactId>dynamic-datasource-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>lock4j-redisson-spring-boot-starter</artifactId> </dependency> </dependencies> </project> ruoyi-common/src/main/java/com/ruoyi/common/annotation/RedisLock.java
ÎļþÒÑɾ³ý ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
@@ -1,16 +1,14 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.annotation.RedisLock; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisLockManager; import com.ruoyi.demo.service.ITestDemoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; /** @@ -24,45 +22,27 @@ public class RedisLockController { @Autowired private RedisLockManager redisLockManager; private ITestDemoService testDemoService; /** * #p0 æ è¯å第ä¸ä¸ªåæ°ä¸ºrediséçkey * æµè¯lock4j * @param key * @param value * @return */ @GetMapping("/testLock1") @RedisLock(expireTime = 10, key = "#p0") public AjaxResult<String> testLock1(String key, String value) { try { // åæ¶è¯·æ±æé // Thread.sleep(5000); // éè¶ æ¶æµè¯ Thread.sleep(11000); } catch (InterruptedException e) { e.printStackTrace(); } @GetMapping("/testLock4j") public AjaxResult<String> testLock4j(String key,String value){ testDemoService.testLock4j(key); return AjaxResult.success("æä½æå",value); } @GetMapping("/testLock4jLockTemaplate") public AjaxResult<String> testLock4jLockTemaplate(String key,String value){ testDemoService.testLock4jLockTemaplate(key); return AjaxResult.success("æä½æå",value); } /** * æµè¯éå·¥å ·ç±» */ @GetMapping("/testLock2") public AjaxResult<Void> testLock(String key, Long time) { try { boolean flag = redisLockManager.getLock(key, time, TimeUnit.SECONDS); if (flag) { log.info("è·åéæå: " + key); Thread.sleep(3000); redisLockManager.unLock(key); log.info("éæ¾éæå: " + key); } else { log.error("è·åé失败: " + key); } } catch (InterruptedException e) { log.error(e.getMessage()); } return AjaxResult.success(); } /** * æµè¯spring-cache注解 ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java
@@ -18,6 +18,11 @@ * @date 2021-05-30 */ public interface ITestDemoService extends IServicePlus<TestDemo> { void testLock4j(String key); void testLock4jLockTemaplate(String key); /** * æ¥è¯¢å个 * @return ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java
@@ -2,6 +2,10 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import com.baomidou.lock.annotation.Lock4j; import com.baomidou.lock.executor.RedissonLockExecutor; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.annotation.DataScope; @@ -18,8 +22,10 @@ import com.ruoyi.demo.mapper.TestDemoMapper; import com.ruoyi.demo.service.ITestDemoService; import com.ruoyi.demo.vo.TestDemoVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalTime; import java.util.Collection; import java.util.List; import java.util.Map; @@ -33,6 +39,43 @@ @Service public class TestDemoServiceImpl extends ServicePlusImpl<TestDemoMapper, TestDemo> implements ITestDemoService { @Autowired private LockTemplate lockTemplate; @Override public void testLock4jLockTemaplate(String key) { final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); if (null == lockInfo) { throw new RuntimeException("ä¸å¡å¤çä¸,请ç¨ååè¯"); } // è·åéæåï¼å¤çä¸å¡ try { try { Thread.sleep(8000); } catch (InterruptedException e) { // } System.out.println("æ§è¡ç®åæ¹æ³1 , å½å线ç¨:" + Thread.currentThread().getName()); } finally { //éæ¾é lockTemplate.releaseLock(lockInfo); } //ç»æ } @Override @Lock4j(executor = RedissonLockExecutor.class,keys = {"#key"}) public void testLock4j(String key) { System.out.println("start:"+key+",time:"+LocalTime.now().toString()); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("end :"+key+",time:"+LocalTime.now().toString()); } @Override public TestDemoVo queryById(Long id) { return getVoById(id, TestDemoVo.class); ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RedisLockAspect.java
ÎļþÒÑɾ³ý