亚洲国产成人久久综合_久久99国产精品成人_久久久精品免费视频_欧美特黄一级大片

針對RedisTemplate分布式鎖實現WatchDog

2023-04-17 08:45:34 來源:騰訊云


(資料圖片)

在此之前,去看了下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;        }}

關鍵詞:

相關文章

熱文推薦

針對RedisTemplate分布式鎖實現WatchDog
針對RedisTemplate分布式鎖實現WatchDog

在此之前,去看了下Redission的實現原理,不過在開發......更多>

早知道:上市公司獨立董事制度全面改革;寧德時代鈉離子電池首發落地
早知道:上市公司獨立董事制度全面改革;寧德時代鈉離子電池首發落地

上市公司獨立董事制度全面改革,履職更具“獨立性”;......更多>

廣發證券:AI投資會有一段時間調整期,下一階段依靠兩方面外界因素_全球快資訊
廣發證券:AI投資會有一段時間調整期,下一階段依靠兩方面外界因素_全球快資訊

廣發證券最新研報表示,AI方面的投資會有一段時間的調......更多>

環球動態:華泰證券:關注AI大模型在終端側的輕量化應用
環球動態:華泰證券:關注AI大模型在終端側的輕量化應用

華泰證券研報表示,模型壓縮技術是實現AI大模型在邊 ......更多>

排行推薦

旺能環境:簽署《監利市餐廚垃圾綜合處理和資源化利用項目特許經營協議》|世界簡訊
旺能環境:簽署《監利市餐廚垃圾綜合處理和資源化利用項目特許經營協議》|世界簡訊
旺能環境(002034):簽署《監利市餐廚垃圾綜合處理和資... 更多>
環球微頭條丨中證報:因城施策持續顯效,樓市企穩跡象漸增
環球微頭條丨中證報:因城施策持續顯效,樓市企穩跡象漸增
中指研究院認為,各地因城施策支持力度不斷增強,短期... 更多>
證券日報:旅游市場加快復蘇, “五一”出行熱度高漲
證券日報:旅游市場加快復蘇, “五一”出行熱度高漲
攜程旗下FlightAi市場洞察平臺數據顯示,截至4月14日... 更多>
中信建投:光伏估值處于低位 看好一季報業績超預期方向_世界即時
中信建投:光伏估值處于低位 看好一季報業績超預期方向_世界即時
中信建投最新研報表示,市場對于光伏板塊預期悲觀,主... 更多>
世界今日報丨俄羅斯總統普京會見李尚福
據新華社,當地時間4月16日,俄羅斯總統普京在莫斯科... 更多>
全球今熱點:經濟日報:確保電力平穩迎峰度夏
文章稱,隨著社會生產生活快速恢復,今年迎峰度夏期間... 更多>
經濟日報:多渠道拓展國產大豆消費|全球滾動
國家糧食和物資儲備局科學研究院首席研究員李愛科撰文... 更多>
天天熱訊:國內成品油零售價將迎今年來最大漲幅,92號汽油每升上漲0.4元左右
受國際油價大幅攀升影響,國內汽柴油零售價結束連跌走... 更多>
【環球新視野】產業趨勢投資中,如何賺“認知差”的錢?
投資進化論系列:消除不確定性這一輪令人瞠目結舌的AI... 更多>
全球觀熱點:寫給所有散戶的一封信:換手率大于7%意味著什么?看懂少走彎路!
所謂市場,就是交易場所。市場本身不產生利潤。所謂賺... 更多>
上海誼眾紫杉醇聚合物膠束新增適應癥臨床獲批
$上海誼眾(SH688091)$從國家藥品監督管理局藥品評審中... 更多>
機構開始覆蓋光庫_觀點
光庫周五漲13 69%。機構覆蓋開始了。海通吹響號角,... 更多>
30年期國債期貨即將上市 首批3個合約將于4月21日交易
具體而言,中金所在《通知》中稱,30年期國債期貨首批... 更多>
時訊:好奇和天真
$東阿阿膠(SZ000423)$自己的簽名檔從來到雪球就是這個... 更多>

世界動態:今年應該買什么(主線順序

淺談華晨中國01114的估值和安全邊際

【價值重估】醫藥板塊逆勢上漲,AI

滾動:無名最終票房具體詳細內容是

當前資訊!人頭攢動 掌聲連連!廣交

世界新消息丨持有興業銀行的投資者

埃安肖勇:特斯拉不是不能戰勝

寧德時代鈉離子電池首發落地奇瑞車

繼續討論不同輪動日的影響

4月16日:|世界快資訊

亚洲国产成人久久综合_久久99国产精品成人_久久久精品免费视频_欧美特黄一级大片
国产九九精品| 亚洲一区二区在| 欧美人交a欧美精品| 国产精品99久久久久久www| 国产在线一区二区三区四区| 欧美日本一区| 鲁大师影院一区二区三区| 中国日韩欧美久久久久久久久| 国产在线视频欧美一区二区三区| 欧美日韩一区二区三区在线| 美女主播精品视频一二三四| 欧美在线亚洲| 午夜精品一区二区三区在线视| 99国产精品久久久久久久| 伊人婷婷欧美激情| 韩国美女久久| 国产啪精品视频| 国产精品中文字幕欧美| 欧美性片在线观看| 欧美三级网页| 欧美视频在线观看视频极品| 欧美高清视频一区二区| 免费观看久久久4p| 男人天堂欧美日韩| 欧美第十八页| 欧美巨乳在线观看| 欧美日本在线播放| 欧美日韩一级黄| 欧美少妇一区二区| 欧美午夜精品久久久久久人妖 | 欧美日韩另类字幕中文| 美女日韩在线中文字幕| 久久一区亚洲| 欧美激情在线狂野欧美精品| 欧美高清视频在线观看| 欧美精品一区二区三区在线播放 | 久久xxxx精品视频| 久久国产精品久久久久久| 香港久久久电影| 欧美在线视频导航| 久久综合色88| 欧美日韩在线看| 国产伦精品一区二区三区四区免费| 国产精品稀缺呦系列在线| 国产精品永久在线| 永久555www成人免费| 亚洲激情视频在线播放| 一区二区三区精品在线| 亚洲欧美日韩精品综合在线观看| 欧美在线观看网址综合| 欧美jizz19性欧美| 国产精品劲爆视频| 在线欧美小视频| 中文国产亚洲喷潮| 久久久综合网站| 欧美日韩和欧美的一区二区| 国产欧美精品在线| 亚洲精品日韩在线| 欧美一级理论片| 欧美精品偷拍| 精品av久久707| 亚洲天堂久久| 欧美不卡高清| 国产欧美三级| 99国产精品一区| 久久综合九色九九| 国产精品久久9| 亚洲欧洲一区二区三区| 欧美一级大片在线免费观看| 欧美电影免费观看高清完整版| 国产麻豆综合| 亚洲视频在线观看网站| 美女精品自拍一二三四| 国产亚洲激情在线| 亚洲女人av| 欧美日韩三级| 亚洲欧洲日本专区| 久久久久久网址| 国产日韩欧美麻豆| 亚洲欧美视频在线观看视频| 欧美日本国产视频| 亚洲第一精品福利| 久久久91精品国产| 国产视频亚洲精品| 午夜精品一区二区三区在线| 欧美伦理视频网站| 亚洲另类在线一区| 欧美国产乱视频| 亚洲欧洲三级电影| 欧美 日韩 国产 一区| 在线成人欧美| 免费中文日韩| 亚洲精品国精品久久99热一| 欧美 亚欧 日韩视频在线| 精品69视频一区二区三区| 久久精品人人做人人爽| 国产一区久久| 久久久视频精品| 伊人狠狠色丁香综合尤物| 久久久噜噜噜| 亚洲国产精品久久久| 免费中文字幕日韩欧美| 亚洲精品麻豆| 欧美特黄视频| 亚洲免费在线观看视频| 国产精品久久久久永久免费观看 | 欧美午夜一区| 亚洲男人av电影| 国产日韩欧美一区在线| 久久琪琪电影院| 亚洲欧洲在线免费| 欧美色图天堂网| 欧美永久精品| 亚洲大片在线| 国产精品成人国产乱一区| 午夜精品久久久| 激情亚洲成人| 欧美精品三级日韩久久| 亚洲一级特黄| 好吊色欧美一区二区三区四区 | 久久久www成人免费毛片麻豆| 一区二区三区在线不卡| 欧美激情一区二区三区全黄| 亚洲视频免费| 国产在线观看一区| 欧美日韩国内| 久久精品电影| 一区二区三区黄色| 国产最新精品精品你懂的| 免费久久99精品国产自在现线| 亚洲精品视频免费| 国产亚洲欧美一区| 欧美日韩另类字幕中文| 久久av红桃一区二区小说| 亚洲激情女人| 国产一区在线视频| 欧美色视频在线| 免费黄网站欧美| 香蕉精品999视频一区二区| 亚洲日韩成人| 激情久久久久久| 国产精品丝袜白浆摸在线| 久久综合给合久久狠狠狠97色69| 亚洲午夜国产一区99re久久 | 伊人久久亚洲热| 国产精品久久久久久久久搜平片| 久久综合九色欧美综合狠狠| 亚洲一区二区久久| 亚洲另类黄色| 亚洲日本中文| 亚洲电影在线观看| 国产一区久久| 国产精品午夜在线| 欧美日韩综合视频| 欧美日韩国产一区二区三区| 久久亚洲影音av资源网| 新67194成人永久网站| 亚洲免费在线精品一区| 中国女人久久久| 中文国产亚洲喷潮| 一二三四社区欧美黄| 亚洲美女视频网| 亚洲区一区二区三区| 亚洲精品免费在线| 亚洲人成网站精品片在线观看| 在线观看视频免费一区二区三区 | 亚洲女人天堂av| 亚洲一区二区三区午夜| 中日韩美女免费视频网址在线观看 | 欧美专区在线观看一区| 欧美一区免费视频| 久久成人免费电影| 久久国产综合精品| 久久夜色精品亚洲噜噜国产mv| 久久精品视频va| 美日韩精品视频| 欧美黄色小视频| 国产精品都在这里| 国产农村妇女精品一二区| 国产精品综合av一区二区国产馆| 国产欧美日韩综合精品二区| 国产一区在线播放| 亚洲国产精品一区二区第一页| 亚洲国产欧美日韩另类综合| 亚洲人永久免费| 亚洲女女女同性video| 欧美一区二区在线免费播放| 久久久久久久久一区二区| 免费亚洲婷婷| 国产精品久久久久久一区二区三区 | 国产精品视频久久一区| 激情久久一区| 日韩亚洲欧美精品| 欧美一区二区大片| 欧美成人69av| 国产欧美二区| 亚洲美女啪啪| 久久精品一区| 欧美日韩国产综合视频在线| 国产伦精品一区二区三|