redis解決高并發(fā)看門狗策略的實現(xiàn)
當一個業(yè)務執(zhí)行時間超過自己設定的鎖釋放時間,那么會導致有其他線程進入,從而搶到同一個票,所有需要使用看門狗策略,其實就是開一個守護線程,讓守護線程去監(jiān)控key,如果到時間了還未結束,就會將這個key重新set一次,重置到原來的時間,只要主線程未結束,守護線程就會一直存在,這里還是會有一些問題,就是如果redis宕機了,導致第一個線程拿到了鎖,第二個線程也拿到了鎖,為了解決這個就需要引入紅鎖
1. 導入依賴,這里導入依賴可能會和原先的redis依賴沖突,所以只能留下一個,不然可能會出錯
去除spring-boot-starter-data-redis
<!-- 集成Redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
添加redisson
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.21.0</version> </dependency>
2. 修改配置文件,將之前的配置緩存redisson的
spring: data: redis: # redis配置 url: redis://:127.0.0.1:6379
3. 開始分布式鎖-看門狗策略,找到高頻訪問的業(yè)務添加以下代碼
在業(yè)務方法開始的頭添加
在方法末尾添加釋放鎖,別忘了添加try-catch-finally塊
這是一段完整的分布式處理,有需要直接copy后修改即可
public void doConfirm(ConfirmOrderDoReq req) { String lockKey = DateUtil.formatDate(req.getDate()) + "-" + req.getTrainCode(); RLock lock = null; try { lock = redissonClient.getLock(lockKey); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); if (tryLock) { LOG.info("搶到鎖,開始處理訂單"); } else { LOG.info("很遺憾,沒有搶到鎖"); //當前搶票人數(shù)多,請稍后再試 throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL); } //業(yè)務處理。。。。 } catch (InterruptedException e) { LOG.error("搶票失敗", e); throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL); } finally { LOG.info("鎖被釋放了"); // 釋放鎖 if (lock != null && lock.isHeldByCurrentThread()){ lock.unlock(); } } }
到此這篇關于redis解決高并發(fā)看門狗策略的實現(xiàn)的文章就介紹到這了,更多相關redis 高并發(fā)看門狗策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談redis采用不同內(nèi)存分配器tcmalloc和jemalloc
下面小編就為大家?guī)硪黄獪\談redis采用不同內(nèi)存分配器tcmalloc和jemalloc。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單功能
這篇文章主要介紹了Spring?Boot?整合Redis?實現(xiàn)優(yōu)惠卷秒殺?一人一單,在分布式系統(tǒng)下,高并發(fā)的場景下,會出現(xiàn)此類庫存超賣問題,本篇文章介紹了采用樂觀鎖來解決,需要的朋友可以參考下2022-09-09Redis擊穿穿透雪崩產(chǎn)生原因分析及解決思路面試
這篇文章主要為大家介紹了Redis擊穿穿透雪崩產(chǎn)生原因及解決思路的面試問題答案參考,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步2022-03-03