From 07861104144baa53fd3eb1c2dd82ad8a52c48d81 Mon Sep 17 00:00:00 2001 From: sxq <812980466@qq.com> Date: Tue, 8 Jun 2021 14:55:55 +0800 Subject: [PATCH] =?UTF-8?q?redis=E9=94=81=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=E7=BC=96=E5=86=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/redis/RedisLockManager.java | 112 ++++++++++++++++++ .../common/core/redis/RedisLockUtil.java | 7 -- .../controller/TestRedisLockController.java | 39 ++++++ 3 files changed, 151 insertions(+), 7 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java create mode 100644 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestRedisLockController.java 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 000000000..29a6e18fc --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisLockManager.java @@ -0,0 +1,112 @@ +package com.ruoyi.common.core.redis; + +import cn.hutool.core.lang.Assert; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RCountDownLatch; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +@Component +public class RedisLockManager { + + @Resource + private RedissonClient redissonClient; + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + /** + * 获取锁(不用设置超时时间,一直等待) + * @param key + * @return + */ + public RLock getLock(String key){ + Assert.isTrue(StringUtils.isNotEmpty(key)); + RLock lock = redissonClient.getLock(key); + lock.tryLock(); + return lock; + } + + /** + * 设置过期时间 + * @param key + * @param time 过期时间 + * @param expireUnit 时间单位 + * @return + * @throws InterruptedException + */ + public RLock getLock(String key,Long time, TimeUnit expireUnit) throws InterruptedException { + RLock lock = redissonClient.getLock(key); + lock.tryLock(time,expireUnit); + return lock; + } + + /** + * 设置过期时间 + * @param key + * @param waitTime 获取锁等待时间 + * @param leaseTime 保留锁的时间 + * @param unit 时间单位 + * @return + * @throws InterruptedException + */ + public RLock getLock(String key,long waitTime, long leaseTime, TimeUnit unit)throws InterruptedException{ + RLock lock = redissonClient.getLock(key); + lock.tryLock(waitTime,leaseTime,unit); + return lock; + } + + /** + * + * @param key : 锁的key值 不能为空 + * @param count :countDownLatch 的数量 必须大于等于0 + * @return + */ + public RCountDownLatch countdownLatch(String key,long count){ + Assert.isTrue(StringUtils.isNotEmpty(key)); + Assert.isTrue(count>=0); + RCountDownLatch rCountDownLatch = redissonClient.getCountDownLatch(key); + rCountDownLatch.trySetCount(count); + return rCountDownLatch ; + } + + /** + * 获取公平锁 + * @param key + * @param waitTime 获取锁等待时间 + * @param leaseTime 持有锁的时间 + * @param unit + * @return + * @throws InterruptedException + */ + public RLock getFairLock(String key,long waitTime, long leaseTime, TimeUnit unit)throws InterruptedException{ + RLock lock = redissonClient.getFairLock(key); + lock.tryLock(waitTime,leaseTime,unit); + return lock; + } + + /** + * 获取公平锁 + * @param key + * @param leaseTime 持有锁的时间 + * @param unit + * @return + * @throws InterruptedException + */ + public RLock getFairLock(String key, long leaseTime, TimeUnit unit)throws InterruptedException{ + RLock lock = redissonClient.getFairLock(key); + lock.tryLock(leaseTime,unit); + return lock; + } + + /** + * 释放锁(统一释放) + * @param lock + */ + public void closeLock(RLock lock){ + lock.unlock(); + } +} 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 index 6dc6591ce..c85f3d941 100644 --- 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 @@ -20,13 +20,6 @@ public class RedisLockUtil { 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; - }*/ - /** * 加锁 (RLock)带超时时间的 * @param key diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestRedisLockController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestRedisLockController.java new file mode 100644 index 000000000..ace2026cd --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestRedisLockController.java @@ -0,0 +1,39 @@ +package com.ruoyi.demo.controller; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisLockManager; +import com.ruoyi.demo.vo.TestTreeVo; +import org.redisson.api.RLock; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.time.LocalTime; +import java.util.concurrent.TimeUnit; + +/** + * redis 分布式锁测试 + */ +@RestController +@RequestMapping("/demo/redisLock") +public class TestRedisLockController { + + @Resource + private RedisLockManager redisLockManager; + + /** + * 测试锁 + * @param key + * @param time + * @return + */ + @GetMapping("/getLock") + public AjaxResult testLock(String key,Long time){ + try { + RLock rLock = redisLockManager.getLock(key,time, TimeUnit.SECONDS); + System.out.println(LocalTime.now().toString() +"获取到锁:"+key); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + return AjaxResult.success(); + } +}