redis解決高并發(fā)看門(mén)狗策略的實(shí)現(xiàn)
當(dāng)一個(gè)業(yè)務(wù)執(zhí)行時(shí)間超過(guò)自己設(shè)定的鎖釋放時(shí)間,那么會(huì)導(dǎo)致有其他線(xiàn)程進(jìn)入,從而搶到同一個(gè)票,所有需要使用看門(mén)狗策略,其實(shí)就是開(kāi)一個(gè)守護(hù)線(xiàn)程,讓守護(hù)線(xiàn)程去監(jiān)控key,如果到時(shí)間了還未結(jié)束,就會(huì)將這個(gè)key重新set一次,重置到原來(lái)的時(shí)間,只要主線(xiàn)程未結(jié)束,守護(hù)線(xiàn)程就會(huì)一直存在,這里還是會(huì)有一些問(wèn)題,就是如果redis宕機(jī)了,導(dǎo)致第一個(gè)線(xiàn)程拿到了鎖,第二個(gè)線(xiàn)程也拿到了鎖,為了解決這個(gè)就需要引入紅鎖
1. 導(dǎo)入依賴(lài),這里導(dǎo)入依賴(lài)可能會(huì)和原先的redis依賴(lài)沖突,所以只能留下一個(gè),不然可能會(huì)出錯(cuò)
去除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:63793. 開(kāi)始分布式鎖-看門(mén)狗策略,找到高頻訪問(wèn)的業(yè)務(wù)添加以下代碼
在業(yè)務(wù)方法開(kāi)始的頭添加

在方法末尾添加釋放鎖,別忘了添加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("搶到鎖,開(kāi)始處理訂單");
} else {
LOG.info("很遺憾,沒(méi)有搶到鎖");
//當(dāng)前搶票人數(shù)多,請(qǐng)稍后再試
throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);
}
//業(yè)務(wù)處理。。。。
} catch (InterruptedException e) {
LOG.error("搶票失敗", e);
throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_LOCK_FAIL);
} finally {
LOG.info("鎖被釋放了");
// 釋放鎖
if (lock != null && lock.isHeldByCurrentThread()){
lock.unlock();
}
}
}到此這篇關(guān)于redis解決高并發(fā)看門(mén)狗策略的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis 高并發(fā)看門(mén)狗策略?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Redis中如何保存時(shí)間序列數(shù)據(jù)詳解
與發(fā)生時(shí)間相關(guān)的一組數(shù)據(jù),就是時(shí)間序列數(shù)據(jù),這些數(shù)據(jù)的特點(diǎn)是沒(méi)有嚴(yán)格的關(guān)系模型,記錄的信息可以表示成鍵和值的關(guān)系,這篇文章主要給大家介紹了關(guān)于在Redis中如何保存時(shí)間序列數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-10-10
Redis數(shù)據(jù)庫(kù)的應(yīng)用場(chǎng)景介紹
這篇文章主要介紹了Redis數(shù)據(jù)庫(kù)的應(yīng)用場(chǎng)景介紹,本文講解了MySql+Memcached架構(gòu)的問(wèn)題、Redis常用數(shù)據(jù)類(lèi)型、Redis數(shù)據(jù)類(lèi)型應(yīng)用和實(shí)現(xiàn)方式、Redis實(shí)際應(yīng)用場(chǎng)景等內(nèi)容,需要的朋友可以參考下2015-06-06
Redis序列化反序列化不一致導(dǎo)致String類(lèi)型值多了雙引號(hào)問(wèn)題
這篇文章主要介紹了Redis序列化反序列化不一致導(dǎo)致String類(lèi)型值多了雙引號(hào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

