當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
基于Spring boot 2.1 使用redisson实现分布式锁
生活随笔
收集整理的這篇文章主要介紹了
基于Spring boot 2.1 使用redisson实现分布式锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在博客redis分布式鎖中,講解了基于jedis的單機redis實現的分布式鎖,如果redis是分布式部署的,該方法就沒法使用了,本篇介紹的是基于redisson實現的分布式鎖
組件依賴
首先我們要通過Maven引入Jedis開源組件,在pom.xml文件加入下面的代碼:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.10.5</version> </dependency>redisson配置,我們的redis用的是集群版,使用的代理模式
redis架構圖如下
redisson使用單節點配置(還有哨兵模式,多節點模式)
/*** Redisson 配置* @return*/@Beanpublic RedissonClient redissonClient() {Config config = new Config();String host = redisProperties.getHost();int port = redisProperties.getPort();SingleServerConfig serverConfig = config.useSingleServer().setAddress("redis://" + host + ":" + port).setTimeout(redisProperties.getTimeout()).setDatabase(redisProperties.getDatabase()).setConnectionPoolSize(redisProperties.getMaxActive()).setConnectionMinimumIdleSize(redisProperties.getMinIdle());if (StringUtils.isNotEmpty(redisProperties.getPassword())) {serverConfig.setPassword(redisProperties.getPassword());}return Redisson.create(config);}RedissonLocker的具體實現類
public class RedissonLockerImpl implements RedissonLocker {@Autowiredprivate RedissonClient redissonClient;/**************************可重入鎖**************************//*** 拿不到lock就不罷休,不然線程就一直block* 沒有超時時間,默認30s*?* @param lockKey* @return*/@Overridepublic RLock lock(String lockKey) {RLock lock = redissonClient.getLock(lockKey);lock.lock();return lock;}/*** 自己設置超時時間*?* @param lockKey 鎖的key* @param timeout 秒 如果是-1,直到自己解鎖,否則不會自動解鎖* @return*/@Overridepublic RLock lock(String lockKey, int timeout) {RLock lock = redissonClient.getLock(lockKey);lock.lock(timeout, TimeUnit.SECONDS);return lock;}/*** 自己設置超時時間*?* @param lockKey 鎖的key* @param unit 鎖時間單位* @param timeout 超時時間*?*/@Overridepublic RLock lock(String lockKey, TimeUnit unit, int timeout) {RLock lock = redissonClient.getLock(lockKey);lock.lock(timeout, unit);return lock;}/*** ?嘗試加鎖,最多等待waitTime,上鎖以后leaseTime自動解鎖* @param lockKey ? 鎖key* @param unit ? ? ?鎖時間單位* @param waitTime ?等到最大時間,強制獲取鎖* @param leaseTime 鎖失效時間* @return 如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取),則返回false*/@Overridepublic boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {RLock lock = redissonClient.getLock(lockKey);try {return lock.tryLock(waitTime, leaseTime, unit);} catch (InterruptedException e) {e.printStackTrace();}return false;}/**************************公平鎖**************************//*** ? 嘗試加鎖,最多等待waitTime,上鎖以后leaseTime自動解鎖* @param lockKey ? 鎖key* @param unit ? ? ?鎖時間單位* @param waitTime ?等到最大時間,強制獲取鎖* @param leaseTime 鎖失效時間* @return 如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取),則返回false*/public boolean fairLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {RLock fairLock = redissonClient.getFairLock(lockKey);try {return fairLock.tryLock(waitTime, leaseTime, unit);} catch (InterruptedException e) {e.printStackTrace();}return false;}/*** 釋放鎖* @param lockKey 鎖key*/@Overridepublic void unlock(String lockKey) {RLock lock = redissonClient.getLock(lockKey);lock.unlock();}/*** 釋放鎖*/@Overridepublic void unlock(RLock lock) {lock.unlock();} }業務代碼中使用
String lockKey = userId; // 公平加鎖,60秒后鎖自動釋放 boolean isLocked = false; try {isLocked = redissonLocker.fairLock(lockKey , TimeUnit.SECONDS, 3, 60);if (isLocked) { // 如果成功獲取到鎖就繼續執行// 執行業務代碼操作return GlobalResponse.success();} else { // 未獲取到鎖return GlobalResponse.fail(500, "請勿重復點擊!!");} } catch (Exception e) {return GlobalResponse.fail(500, e.getMessage()); } finally {if (isLocked) { // 如果鎖還存在,在方法執行完成后,釋放鎖redissonLocker.unlock(lockKey);} }
---------------------?
作者:總有刁明想害朕?
來源:CSDN?
原文:https://blog.csdn.net/crystalqy/article/details/89024653?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的基于Spring boot 2.1 使用redisson实现分布式锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL中使用LIMIT进行分页的方法
- 下一篇: 吃透了这些Redis知识点,面试官一定觉