
針對RedisTemplate分布式鎖實現WatchDog_全球熱頭條
2023-04-21 00:14:02 來源:騰訊云
【資料圖】
在此之前,去看了下Redission的實現原理,不過在開發中,原本的代碼使用RedistTemplate實現的,也不太想換,所以我想了下,不如自己實現要給WatchDog。
我的想法是,在用戶加上鎖的時候開啟個定時任務線程,并且在定時任務中,判斷原線程isAlive狀態進行“續命”。
下面是代碼(在這里面為了方便,未使用的是HuTool.CornUtil來實現動態定時任務):
/** * Title * * @ClassName: LockUtil * @Description:鎖工具類,通過內部枚舉類實現單例,防止反射攻擊 * @author: Karos * @date: 2023/1/4 0:17 * @Blog: https://www.wzl1.top/ */package cn.katool.lock;import cn.hutool.core.util.BooleanUtil;import cn.hutool.core.util.ObjectUtil;import cn.hutool.cron.CronUtil;import cn.hutool.cron.task.Task;import cn.katool.Config.LockConfig;import cn.katool.Exception.ErrorCode;import cn.katool.Exception.KaToolException;import cn.katool.other.MethodIntefaceUtil;import com.qiniu.util.StringUtils;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Scope;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.ObjectUtils;import javax.annotation.Resource;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;@Component@Scope("prototype")@Slf4jpublic class LockUtil { @Resource RedisTemplate redisTemplate; private LockUtil(){ } private static boolean isOpenCorn=false; /** * 帶看門狗機制上鎖 * @param lockObj * @return */ public boolean DistributedLock(Object lockObj){ try { return DistributedLock(lockObj,null,null); } catch (KaToolException e) { throw new RuntimeException(e); } } @Resource LockConfig lockConfig; //加鎖 /** * 無看門狗機制上鎖 * @param obj * @param exptime * @param timeUnit * @return * @throws KaToolException */ public boolean DistributedLock(Object obj,Long exptime,TimeUnit timeUnit) throws KaToolException { if (ObjectUtil.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 傳入obj為空"); } Boolean isDelay=false; if (ObjectUtil.isAllEmpty(exptime,timeUnit)){ isDelay=true; } if(ObjectUtil.isEmpty(exptime)){ exptime= lockConfig.getInternalLockLeaseTime();; } if (ObjectUtils.isEmpty(timeUnit)){ timeUnit=lockConfig.getTimeUnit(); } //線程被鎖住了,就一直等待 DistributedAssert(obj); Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("Lock:"+obj.toString(), "1", exptime, timeUnit); log.info("katool=> LockUntil => DistributedLock:{} value:{} extime:{} timeUnit:{}",obj.toString(), "1", exptime, timeUnit); //實現看門狗 if (isDelay){ if (LockUtil.isOpenCorn==false){ //如果同一個項目之前打開過,那么先關閉,避免重復啟動 CronUtil.stop(); //支持秒級別定時任務 CronUtil.setMatchSecond(true); //定時服務啟動 CronUtil.start(); LockUtil.isOpenCorn=true; } Thread thread = Thread.currentThread(); TimeUnit finalTimeUnit = timeUnit; Long finalExptime = exptime; class TempClass{ public String scheduleId; } final TempClass tempClass = new TempClass(); tempClass.scheduleId=CronUtil.schedule("0/30 * * * * ?", new Task() { @SneakyThrows @Override public void execute() { boolean alive = thread.isAlive(); if (alive) { delayDistributedLock(obj, finalExptime>=3?(finalExptime / 3):finalExptime, finalTimeUnit); return; } else { if (tempClass.scheduleId==null||"".equals(tempClass.scheduleId)){ return; } CronUtil.remove(tempClass.scheduleId); DistributedUnLock(obj); return; } } }); } return BooleanUtil.isTrue(aBoolean); } //檢鎖 public void DistributedAssert(Object obj) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 傳入obj為空"); } while(true){ Object o = redisTemplate.opsForValue().get("Lock:" + obj.toString()); if (ObjectUtils.isEmpty(o))return; } } //延期 public boolean delayDistributedLock(Object obj,Long exptime,TimeUnit timeUnit) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 傳入obj為空"); } Boolean aBoolean = redisTemplate.opsForValue().setIfPresent("Lock:"+obj.toString(), "1", exptime, timeUnit); log.info("katool=> LockUntil => delayDistributedLock:{} value:{} extime:{} timeUnit:{}",obj.toString(), "1", exptime, timeUnit); return BooleanUtil.isTrue(aBoolean); } //釋放鎖 public boolean DistributedUnLock(Object obj) throws KaToolException { if (ObjectUtils.isEmpty(obj)){ throw new KaToolException(ErrorCode.PARAMS_ERROR," Lock=> 傳入obj為空"); } Boolean aBoolean = redisTemplate.delete("Lock:" + obj.toString()); log.info("katool=> LockUntil => unDistributedLock:{} isdelete:{} ",obj.toString(),true); return BooleanUtil.isTrue(aBoolean); } //利用枚舉類實現單例模式,枚舉類屬性為靜態的 private enum SingletonFactory{ Singleton; LockUtil lockUtil; private SingletonFactory(){ lockUtil=new LockUtil(); } public LockUtil getInstance(){ return lockUtil; } } @Bean("LockUtil") public static LockUtil getInstance(){ return SingletonFactory.Singleton.lockUtil; }}
標簽:
業界
更多
-
20
2023-04賭王三太被稱贊氣質超群 不愧是賭王看上的女人 焦點訊息
4月18日,何超蓮和竇驍的世紀婚禮舉行,兩個人低調很久,不愿意透露半點消息,只能從一些路透來看一些婚禮 -
20
2023-04sasan礦山(sasan)
1、XSS的內存真的很失望。那并不容易去補償,嚴重降低了次世代多平臺的基礎配置。相比之前的世代,這一次的 -
20
2023-04一男性游客被指逼哭工作人員 上海迪士尼:涉事者被終身禁入
一男性游客被指逼哭工作人員上海迪士尼:涉事者被終身禁入 -
20
2023-04滿易貸網貸逾期3天征信有什么影響
網貸逾期一般會上征信,有些借貸機構在用戶逾期后一天后就會上報給征信機構,而有些借貸機構則是會在幾天后 -
20
2023-04【天天新要聞】皇馬隊內歐冠最高速排行榜:巴爾韋德36.3km/h第一,維尼修斯第二
歐足聯官方數據統計顯示,巴爾韋德是皇馬本賽季歐冠跑動速度最快的球員。附皇馬歐冠最高時速排行榜:1-巴爾 -
20
2023-04美國得州一湖中接連出現浮尸:今年已有4起 30歲男子疑是攻擊目標 今日訊
美國得州奧斯汀鳥湖接連出現浮尸(圖:《紐約郵報》)海外網4月20日電據《紐約郵報》19日報道,美國得克薩 -
20
2023-04瀘州市、璧山區消委聯合舉辦川渝比鄰地區首屆消費維權能力提升培訓班
為提升消費維權一線工作人員消費投訴處理能力和水平,4月18日,瀘州市消委與重慶市璧山區消委聯合舉辦了川 -
20
2023-04世界快看點丨進軍歐洲,數字王國攜手Mastercard OFF CAMERA國際獨立電影節
進軍歐洲,數字王國攜手MastercardOFFCAMERA國際獨立電影節 -
20
2023-04養老金繳費基數有什么用?繳費基數越高越好嗎?
養老金繳費基數有什么用?繳費基數越高越好嗎?社保網小編介紹養老金繳費基數知識。養老金的計發基數,是按 -
20
2023-04探究酵母菌呼吸方式(酵母菌的生殖方式) 世界信息
一、題文酵母菌的生殖方式是( )A 分裂生殖B 孢子生殖C 營養生殖D 出芽生殖或有性生殖二、解答酵母菌屬 -
20
2023-04河北農業大學2023年碩士研究生調劑考生復試成績 每日頭條
從河北農業大學獲悉,河北農業大學2023年碩士研究生調劑考生復試成績已發布,如下:河北農業大學2023年碩士 -
20
2023-04全球新動態:dota2更新不了了_dota2更新不了
1、打開steam軟件,登錄你的賬戶。如圖所示。2、單擊steam中的set命令。如圖所示。3、進入下載選項卡。如圖所示
手機
更多

使用墨鏡或太陽鏡看手機屏幕時,常常會出現部分屏幕變得黑漆漆一片的情況,給使用帶來了不便。蘋果最近獲得了一項專利,可以解決這個問題。
2023-03-24

蘋果考慮將iPhone系列進一步延伸 2024年上市?
蘋果正在考慮將iPhone的Pro系列進一步向上延伸,一位可靠的泄密者的報告堅稱它可能會在2024年上市。自 2022 年年中以來的傳言提出了蘋果
2023-02-07

卷出一塊好曲屏 真我10系列新品發布會舉行
11月17日下午,真我realme舉行主題為卷出一塊好曲屏的真我10系列新品發布會,正式推出全新一代科技越級代表作真我10系列的三款新品以及真我
2022-11-17
英國猴痘病例數預計將大幅上升
人民網倫敦5月22日電 (余穎)截至5月20日,英國確診猴痘病例總數上升至20例。由于猴痘病毒在英國已經開始社區傳
2022-05-24
上海:視情適當延長畢業生在校生身份時間
人民網北京5月23日電 (記者孫競)據上海市教委政務微信"上海教育"消息,為做好2022屆高校畢業生就業創業工作,
2022-05-24
國家電網確定新型電力系統科技攻關十大重點項目
5月19日,國家電網新型電力系統科技攻關行動計劃2022專項重大科技項目責任狀簽訂視頻會議在京召開。國家電網公司
2022-05-24
比亞迪發布CTB電池車身一體化技術
5月20日,比亞迪發布了CTB電池車身一體化技術及首款搭載了CTB技術的e平臺3 0車型。比亞迪CTB電池車身一體化技術簡
2022-05-24
商務部:堅定致力于實現全面、高水平的亞太自貿區
人民網北京5月23日電 (記者趙竹青)據商務部網站消息,21至22日,亞太經合組織(APEC)舉行第二十八屆貿易部長
2022-05-24
中辦國辦印發《意見》 推進實施國家文化數字化戰略
新華社北京5月22日電近日,中共中央辦公廳、國務院辦公廳印發了《關于推進實施國家文化數字化戰略的意見》(以下
2022-05-24
初夏看市場:“菜籃子”產品生產供應充足 蔬菜在田面積達9877.2萬畝
人民網北京5月23日電 (記者李棟)據農業農村部最新發布,我國主要“菜籃子”產品生產供應充足,當前蔬菜在田面
2022-05-24
上海浦東重點生產企業復工復產超1100家
新華社上海5月22日電(記者楊有宗)記者22日從上海市浦東新區獲悉,浦東新區企業復工復產持續推進,截至目前,在
2022-05-24
測評
-
1
Intel最新處理器Arrow-S曝光 最高可達24核
-
2
配置拉滿的電競神機 雷神ZERO2023大黃蜂發布
-
3
真我10Pro系列發布 首發量產2160Hz超高頻調光技術
-
4
阿富汗塔利班組建正規軍
-
5
薩赫勒地區反恐形勢面臨新變數
-
6
北約北擴加劇歐洲安全風險
-
7
貴州畢節七星關區百所學校創辦百個“紅軍班”
-
8
湖北省孝感軍分區組織軍地聯合應急救援研究性演練
-
9
青藏高原等區域將新設一批國家公園
-
10
河北省承德軍分區退役軍人擔綱教練主力
軟件
數碼