針對RedisTemplate分布式鎖實現WatchDog-熱資訊
2023-04-21 16:12:29來源:騰訊云
【資料圖】
在此之前,去看了下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; }} 標簽:
電腦
-
電腦定時開機關機在哪里設定?電腦如何設置定時開機和關機方法?我們使用電腦在工作中,可能會使用到定時開關機的功能,一般來說,定時關機在系統上通過CMD命令、創建個...
-
電腦主板如何在BIOS中設置網卡啟動?無盤電腦設置PXE網卡啟動方法分享一般來說,設置電腦從網卡啟動一般絕大數應用于無盤系統,當然主板上的網卡必須包含PXE芯片,否則無法啟...
-
電腦通電自啟動怎么設置?主板BIOS之電腦通電自動開機設置步驟最近一個用戶想要電腦實現一個功能,那就是電腦通電之后,電腦會自動開機,這樣就不需要人為去開機了,...
-
重做系統網絡連接不出來怎么辦?計算機無法上網是什么原因?計算機重新安裝系統后無法上網。很多朋友問,為什么會有這樣的事情?如何處理?重點分析使用網絡遠程控制...
-
商務辦公選銳龍還是酷睿?聯想ThinkPad T14 Gen3怎么樣?提到移動商務辦公,很多用戶不免第 一時間想到絕 對經典的ThinkPad的T系列機型,從新近的機型中去選擇...
硬件
- 聯想萬能無線網卡驅動如何安裝?無線網卡驅動安裝方法分享
- nvidia顯示設置不可用未檢測到圖形卡怎么解決?nvidia顯示設置不可用怎么辦?
- 華碩筆記本uefi bios如何設置?華碩主板開啟uefi模式方法分享
- 顯卡驅動有必要更新嗎?為什么需要更新顯卡的驅動程序?
- 臺式電腦cpu溫度多少正常?cpu溫度過高怎么辦?
- mac裝雙系統傷電腦嗎?mac裝雙系統有哪些壞處?
- 影馳主板是幾線品牌?影馳主板功能配置怎么樣?
- wifi密碼忘記了怎么辦?找怎么找回wifi密碼?
- 電腦聲卡驅動如何安裝?電腦聲卡驅動安裝技巧分享
- ghost系統是什么意思?Ghost系統有哪些優缺點?
- 如何開啟內存雙通道模式?開啟內存雙通道模式方法分享
- 內存的傳輸類型是什么?內存常見術語有哪些?
- 內存故障的表現有哪些?內存接觸不良引起的故障怎么解決
- 什么是虛擬內存?虛擬內存怎么設置最好?
- 針對RedisTemplate分布式鎖實現WatchDog-熱資訊
- Consul 簡單示例
- 商洛市墓地治理專項行動工作現場觀摩會召開
- 應縣氣象局發布道路結冰黃色預警【Ⅲ級/較重】
- 講臺上的詩人 動態焦點
- 2023年上海車展:理想汽車宣布進軍純電市場,發布純電解決方案
- 今日報丨上海市經濟信息化委:構建科創算力新設施 統籌算力基礎設施布局
- 326只股短線走穩 站上五日均線
- “氧氣美女”左小青:陳道明唯一緋聞女友,嫁大20歲富豪生活幸福_今日觀點
- “尋尋覓覓,勛勛冪冪”兩人傳出緋聞,馬思純曾這樣點評魏大勛
- 全球頂級家電及消費電子盛會AWE2023將開幕 ChatGPT賦能下的智能家電望“引爆”市場
- 2023年殘疾人兩項補貼年度資格認定工作開始 廣東戶籍殘疾人6月20日前申報 焦點熱訊
- 世界聚焦:「高清組圖」貴州劍河:洞腳村春景如畫
- 貴州松桃:春風襲來 鴿子花開
- 華東地區包括哪些省
- 花溪區氣象臺發布冰雹橙色預警信號【Ⅱ/嚴重】
- 每日關注!一季度數據出爐!廣西經濟開局平穩向好
- 買高端機等于智商稅嗎?在性能趨同的情況下,高端機“高”在哪了?
- 為什么國產機做不出蘋果的質感?蘋果手機使用什么材料制造?
- 二手手機到底能不能買,買的時候又應該注意哪些問題?
- 影響手機續航能力的因素有哪些?怎么延長手機的續航能力?
- 如何判斷一款手機的屏幕好壞?手機屏幕分辨率是不是越高越好?
- 為什么大家看不起手機的LCD屏幕?手機LCD屏幕存在哪些缺陷?
- Redmi性價比怎樣?紅米怎么看電池損耗?
- 智能手表是雞肋還是剛需?applewatch有必要買么?
- 為什么歐洲人不做手機了?是輸不起,還是有心無力呢?
- 【天天時快訊】池州市39個村入選省級美麗宜居村莊
- 全球速看:點乘和叉乘的區別幾何意義 點乘和叉乘的區別
- 哈爾濱呼蘭海事處“防”字當頭上好水上交通安全第一課
- 力盟科技午后持續拉升 股價一度漲超22%|全球快看
- 熱消息:ChatGPT板塊進一步走強 萬興科技創歷史新高
- 榮耀 X50i 手機發布:一億像素主攝 + 6.7 英寸大屏,1499 元起-每日快播
- 蘋果手機產量這么大,它的手機系統是怎么錄入進去的?
- 新農開發:尊敬的投資主要是市場化資源整合原因,具體請查看公司公告及說明
- 在更高的起點創業!專訪Aqara重慶服務商,探問「經營秘籍」!|天天熱門
- 內蒙古路況氣象預警信息(2023.4.21)_今日熱搜
- 交警宣傳進農村 安全守護暖人心
- 環球即時:6%數量“撬動”20%產值 上海汽車行業繼續在智造上“深耕細作”
- 環球資訊:唱衰中國發展,癡人說夢話(望海樓) ——污蔑中國抗疫,美方何其荒唐④
- 財政金融齊發力 經濟向好底氣足_每日速讀
- 每日速訊:集中調解糾紛 為農耕保駕護航
- arriveguide男裝是哪個國家的品牌_什么檔次怎么樣 今頭條
- 2022湯圓十大品牌排行榜_湯圓哪個牌子好|環球快消息
- 當前通訊!喂!我們愛你多多
- 世界要聞:中金:國際線或被市場嚴重低估 自二季度起可能出現跨越式恢復
- 華泰證券:黃金珠寶需求加速釋放 板塊格局清晰、優選領先龍頭 焦點消息
- 世界焦點!廣州房地產管理職業學院_廣州市房地產管理學校
- 世界快播:喜糖買什么牌子的好_中國十大喜糖品牌2021
- 全球訊息:北京西城:結對共建 筑牢金融風險“防火墻”
- 【天天新要聞】火熱!“五一”假期鐵路客票銷售創同期歷史新高
- 日本90名國會議員集體參拜靖國神社,成員分別來自自民黨、日本維新會等政黨|天天精選
- 武漢市發布2023年高中階段學校招生考試工作的通知
- 楚雄州以高質量招商引資推動高質量發展-世界速遞
- 腸衣是什么做的_腸衣的原料
- 學做油條的方法_學做油條有什么方法-天天看點
- 全球熱點評!河北日報評論員|從政治和全局高度深刻認識主題教育的重要意義
- 大航海時代ol?攻略 環球看熱訊
- 福山潤配音的動漫主角_福山潤
- 樂經良教授_樂經
- 空調制冷不制熱的原因_空調為什么制冷不制熱
- CMA管理會計證書有必要考嗎?考了可以做什么工作?_當前要聞
- 2023年中華茶祖節開幕 助力鄉村振興 環球熱訊
- 環球微頭條丨中國自研海底地震勘探節點采集裝備實現產業化制造
- 渡遠戶外、京磁股份4月26日深交所首發上會 全球播資訊
- 天天滾動:進口額大幅增加 日本2022財年貿易逆差達217285億日元
- 興蓉環境:中標億元17都市龍泉驛區2022年污水治理攻堅項目
- 浙江一季度生產總值同比增長4.9%
- 環球熱頭條丨杜蘭特:我和萊昂納德相互尊重 我倆都有著獨特的經歷
- 天天快報!4月21日中鋼網期貨早報:盤面弱勢中,黑色系波動加劇
- 4-5月鋼廠停產檢修及生產情況 全球快消息
- 《天回醫簡》正式整理出版 或為失傳扁鵲醫書_天天微資訊
- 環球觀點:寧夏8個產業鏈項目集中簽約 簽約金額達12.46億元
- 每日熱點:京多安:渴望明年隨隊參加主場歐洲杯 3-0拜仁還只是對決的半場
- 米切爾:麥迪遜廣場花園會很喧鬧 但作為競爭者會喜歡這種氛圍
- 二階俊博就任日中友好議員聯盟新會長,外交部回應
- 算力概念大火,24位基金經理發生任職變動 當前消息
- 江西省九江市2023-04-21 06:57發布大風藍色預警 最新快訊
- 五菱宏光mini的電池是什么電池 磷酸鐵鋰電池(最新款宏光mini僅售3萬元)
- 市場營銷師含金量高嗎 主要是做什么
- 社會工作專業是干什么的 就業方向有哪些-全球速遞
- 速訊:乙肝能治好嗎_我被中年婦女搞
- 談合同需要注意什么_簽合同時需要注意哪些事項
- 【超級重磅】金地!金地!金地!40億豪奪嘉定2塊超優宅地!_當前最新
- 7057套!嘉定計劃今年完成9個動遷安置房項目
- 吉布提魯班工坊:中非友誼之路越走越實 焦點消息
- 精工科技:2022年度凈利潤約2.93億元,同比增加171.99%|看熱訊
- 4個工具,讓 ChatGPT 如虎添翼!
- 什么牙膏去煙漬效果好?去煙漬最好的牙膏十大品牌排行榜|全球觀天下
- 世界熱消息:「私募基金排名」加快補齊住房租賃短板 發展保障性租賃住房是關鍵
- 《呂氏春秋》中的養生觀|天天熱點
- 世界滾動:理貨員爆料:超市里這3種東西,低價也不帶回家,自家人更不會吃
- 央行:預計2023年信貸投放以及社會融資規模增長將保持平穩
- 狼性十足的星座-焦點熱議
- 專升本需要多久 如何報考專升本
- 世界簡訊:中國稀有好聽的姓氏,赤橙黃綠青藍紫都是姓氏
- 游戲盒排行榜前十名_公認最好的6款游戲盒子-全球熱點評
- 世界新動態:高考模擬志愿怎么填?
- 易滑路段標志|熱訊
- 全球播報:宋新船
- 山西梅生書畫研究院
電競
數碼
事件
- 寶塔面板創建DVWA靶場,php-fpm報502問題|關注04-21
- “50元返188,100元返588”,竟然還有人被騙! 全球微資訊04-21
- 熱點評!山東首個計算醫學概念驗證中心在青揭牌,將采用產業資源共享模式04-21
- 上海證券交易所原副總經理劉逖接受監察調查_天天微頭條04-21
- 天天熱文:何超蓮竇驍巴厘島大婚,酒店房間最貴6萬,雙方家長到場見證幸福04-21
- 粵一季度新能源現貨交易電量達5600萬千瓦時04-21
- 每日視訊:種植牙“千元時代”來了!棗莊市中區患者成為山東首位受益者04-21
- 青馬當日,這些人憑證件可免費乘公交啦_環球快訊04-21
- “三月三”假期廣西天氣如何?這些地方大雨、暴雨、大暴雨……04-21
- 千味央廚:今年餐飲復蘇跡象較為明顯04-21
- 各地深入挖掘農村內需潛力(權威發布)04-21
- 【天天新要聞】內蒙古自治區氣象臺解除大風藍色預警【IV級/一般】04-21
- 世界觀點:外交部發言人:敦促美國等發達國家審慎評估自身經濟金融政策外溢影響04-21
- 每日消息!靜脈曲張襪10大品牌_靜脈曲張襪品牌排行榜04-21
- 焦點速看:泰達宏利王鵬:市場偏存量博弈 關注景氣度機會04-21










