<nav id="cjthq"><strong id="cjthq"><legend id="cjthq"></legend></strong></nav>

        国产av丝袜熟女一二三,麻豆精品一区二区视频在线,中文字幕日韩精品人妻,精品无码av不卡一区二区三区,国产精品自在自线视频,久久国产亚洲精选av,91精品国产91久久综合,一本一道久久久a久久久精品91

        針對(duì)RedisTemplate分布式鎖實(shí)現(xiàn)WatchDog

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


        (資料圖片)

        在此之前,去看了下Redission的實(shí)現(xiàn)原理,不過在開發(fā)中,原本的代碼使用RedistTemplate實(shí)現(xiàn)的,也不太想換,所以我想了下,不如自己實(shí)現(xiàn)要給WatchDog。

        我的想法是,在用戶加上鎖的時(shí)候開啟個(gè)定時(shí)任務(wù)線程,并且在定時(shí)任務(wù)中,判斷原線程isAlive狀態(tài)進(jìn)行“續(xù)命”。

        下面是代碼(在這里面為了方便,未使用的是HuTool.CornUtil來實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)):

        /** * Title * * @ClassName: LockUtil * @Description:鎖工具類,通過內(nèi)部枚舉類實(shí)現(xiàn)單例,防止反射攻擊 * @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;        /**         * 帶看門狗機(jī)制上鎖         * @param lockObj         * @return         */        public boolean DistributedLock(Object lockObj){                try {                        return DistributedLock(lockObj,null,null);                } catch (KaToolException e) {                        throw new RuntimeException(e);                }        }        @Resource        LockConfig lockConfig;        //加鎖        /**         * 無看門狗機(jī)制上鎖         * @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);                //實(shí)現(xiàn)看門狗                if (isDelay){                        if (LockUtil.isOpenCorn==false){                                //如果同一個(gè)項(xiàng)目之前打開過,那么先關(guān)閉,避免重復(fù)啟動(dòng)                                CronUtil.stop();                                //支持秒級(jí)別定時(shí)任務(wù)                                CronUtil.setMatchSecond(true);                                //定時(shí)服務(wù)啟動(dòng)                                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);        }        //利用枚舉類實(shí)現(xiàn)單例模式,枚舉類屬性為靜態(tài)的        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;        }}

        關(guān)鍵詞:

        相關(guān)文章

        熱文推薦

        針對(duì)RedisTemplate分布式鎖實(shí)現(xiàn)WatchDog
        針對(duì)RedisTemplate分布式鎖實(shí)現(xiàn)WatchDog

        在此之前,去看了下Redission的實(shí)現(xiàn)原理,不過在開發(fā)......更多>

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

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

        廣發(fā)證券:AI投資會(huì)有一段時(shí)間調(diào)整期,下一階段依靠?jī)煞矫嫱饨缫蛩豞全球快資訊
        廣發(fā)證券:AI投資會(huì)有一段時(shí)間調(diào)整期,下一階段依靠?jī)煞矫嫱饨缫蛩豞全球快資訊

        廣發(fā)證券最新研報(bào)表示,AI方面的投資會(huì)有一段時(shí)間的調(diào)......更多>

        環(huán)球動(dòng)態(tài):華泰證券:關(guān)注AI大模型在終端側(cè)的輕量化應(yīng)用
        環(huán)球動(dòng)態(tài):華泰證券:關(guān)注AI大模型在終端側(cè)的輕量化應(yīng)用

        華泰證券研報(bào)表示,模型壓縮技術(shù)是實(shí)現(xiàn)AI大模型在邊 ......更多>

        排行推薦

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

        世界動(dòng)態(tài):今年應(yīng)該買什么(主線順序

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

        【價(jià)值重估】醫(yī)藥板塊逆勢(shì)上漲,AI

        滾動(dòng):無名最終票房具體詳細(xì)內(nèi)容是

        當(dāng)前資訊!人頭攢動(dòng) 掌聲連連!廣交

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

        埃安肖勇:特斯拉不是不能戰(zhàn)勝

        寧德時(shí)代鈉離子電池首發(fā)落地奇瑞車

        繼續(xù)討論不同輪動(dòng)日的影響

        4月16日:|世界快資訊

        主站蜘蛛池模板: 中文人妻AV大区中文不卡| 高清免费毛片| 国产超清无码视频| 在线精品视频一区二区三四| 国产女专区视频在线播放| 精品国产午夜福利理论片| 一本色道久久99精品综合| 熟妇无码熟妇毛片| 亚洲欧洲综合色视在线| 黑人巨茎大战欧美白妇| 丰满熟女高潮毛茸茸欧洲 | 娇喘快感呻吟视频免费| 男女性高爱潮免费网站| 连城县| 亚洲国产中文在线有精品| 乌拉特中旗| 中文亚洲精油按摩色偷偷AV| 亚洲午夜不卡视频| 色老99久久九九爱精品| 上床片在线观看高清无码| 688欧美人禽杂交狂配| 亚洲乱码成熟视频在线播放| 孩交videos精品乱子| 国产免费人成视频在线播放播| 国产亚洲精品A片久久久| 青草视频在线播放| 国产成人无码综合亚洲日韩| 亚洲AV无码成人网站国产网站| 夜爽8888视频在线观看| 中文无码AV人妻系列| 亚洲全黄无码性色视在线观看| 亚洲欧美高清在线精品一区二区| 人妻互换亂倫激情| 久久人妻丝袜一区二区三区| 欧美性做爰又大又粗又长| 精品无码无人网站免费视频| 日韩欧美精品一区二区三区在线| 精品亚洲国产成人| 免费网站看av片| 精产国品一二三产品区别在哪里| 亚洲av无码一区二区三区18|