三级久久三级久久_精品一区二区三区在线观看视频_黄色在线观看网站_日韩中文视频_成人观看网址_精品日韩免费_九九**精品视频免费播放_久久久久成人黄色影片

當(dāng)前位置    :     網(wǎng)站首頁    /     應(yīng)用 > 詳情頁

針對RedisTemplate分布式鎖實現(xiàn)WatchDog-熱資訊

2023-04-21 16:12:29來源:騰訊云


【資料圖】

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

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

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

/** * Title * * @ClassName: LockUtil * @Description:鎖工具類,通過內(nèi)部枚舉類實現(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;        /**         * 帶看門狗機制上鎖         * @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);                //實現(xiàn)看門狗                if (isDelay){                        if (LockUtil.isOpenCorn==false){                                //如果同一個項目之前打開過,那么先關(guān)閉,避免重復(fù)啟動                                CronUtil.stop();                                //支持秒級別定時任務(wù)                                CronUtil.setMatchSecond(true);                                //定時服務(wù)啟動                                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);        }        //利用枚舉類實現(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;        }}

標(biāo)簽:

電腦

硬件

電競

數(shù)碼

什么是快門?拍攝時應(yīng)該怎樣選擇快門速度? 相機的參數(shù)設(shè)置有哪些關(guān)鍵點?相機中常見的測光模式有哪些? 富士XS10怎么樣?富士XS10值不值得買? 佳能ixus系列哪個好?佳能ixus最好的型號是什么? 如何讓發(fā)到朋友圈的圖片更清晰?如何減少壓縮對照片的影響?
產(chǎn)品

實時焦點:旅游熱度居高不下 古城民宿供不應(yīng)求 泉州或迎最火“五一”

美媒:拜登最早將于下周正式宣布競選連任美國總統(tǒng) 天天微頭條|當(dāng)前信息

EldenRing獲得了一個令人印象深刻的預(yù)期功能 熱門

科爾:格林有時候會被情緒所左右,這個時候沒有人能阻止他

為未成年人打造“甜甜虎”“甜甜屋” 重慶這個聯(lián)盟一直在行動 環(huán)球信息

欧美一二三在线| 欧美三级韩国三级日本一级| 97香蕉久久| 日本欧美一区二区三区| 国产区视频在线播放| 99国内精品久久| 一二三区精品福利视频| 男人天堂亚洲天堂| 欧洲精品视频在线观看| 台湾佬综合网| 中文字幕人成不卡一区| 香蕉视频在线播放| 男人操女人的视频在线观看欧美| 日韩欧美久久久| 午夜激情影院| 高清视频一区二区| 一区 二区 三区| 国产综合色产在线精品| 忘忧草在线www成人影院| 色婷婷综合久久久中文字幕| 国产成人日日夜夜| 激情久久五月| 国产亚洲一卡2卡3卡4卡新区 | 麻豆av观看| 老司机精品视频一区二区三区| 欧美日韩www| 亚洲综合精品四区| 国产精品探花在线观看| 午夜久久久久久久久久一区二区| 日韩大陆av| 亚洲成av人片在www色猫咪| 日本在线视频一区二区| 亚洲欧洲日产国码av系列天堂| 久久欧美中文字幕| 国产福利图片| 不卡电影一区二区三区| 自拍欧美日韩| 国产精品日本一区二区三区在线| 欧美日韩你懂的| 亚洲午夜在线视频| 亚洲婷婷综合久久一本伊一区| 久久精品国产久精国产| 日韩在线二区| 成人性生交大片免费观看网站| 欧美精品色综合| 经典一区二区三区| 亚洲午夜剧场| 91天堂在线| 一区二区三区日韩| 国产最新精品免费| 污黄网站在线观看| 国产精品久久久久婷婷| 日韩在线成人| 亚洲老司机网| 美女扒开腿让男人桶爽久久软| 欧美性色欧美a在线播放| 成人动漫视频在线| 午夜视频一区| 国产探花一区在线观看| 日韩欧美国产高清91| 久久久天堂av| 伊人久久婷婷| 国产麻豆精品久久| 色综合www| 日韩免费av| 国产欧美日韩精品一区二区三区 | 日韩伦理在线电影| 欧美日韩国产一区| 国产日产欧美一区二区三区| 偷拍欧美精品| 欧美视频网址| 亚洲蜜臀av乱码久久精品蜜桃| 一本一道久久a久久精品蜜桃| 自由日本语热亚洲人| 91超碰在线| 国产精品—色呦呦| 青青草在线视频免费观看| 欧美日韩国产中文| 亚洲www啪成人一区二区麻豆 | 欧美电影在线观看一区| gogo久久| 探花国产精品| 日本韩国一区二区| 米奇777在线影院线| 天堂8中文在线| 免费成人在线电影| 爱高潮www亚洲精品| 欧美精品自拍| 国产日韩一区二区三区在线播放| 亚洲伊人春色| 人人狠狠综合久久亚洲婷| 日韩精品一区二区三区视频播放 | 欧美激情综合网| 国产不卡免费视频| 国产免费观看久久| 91在线国内视频| 精品在线播放午夜| 黄色福利视频网站| 日韩精品中文字幕在线播放| 精品日韩中文字幕| 国产一区啦啦啦在线观看| 亚洲色图美女| 在线观看网站免费入口在线观看国内 | 4438全国亚洲精品观看视频| 久久日本片精品aaaaa国产| 色综合久久精品| av中文字幕在线不卡| 免费播放片a高清在线观看| 亚洲国产精品一区二区久久| 伊人久久亚洲美女图片| 亚洲欧洲高清| 2019中文字幕视频| 欧美激情一区二区三区全黄| 天天综合精品| 成人免费直播| 黄色录像1级片| 亚洲人成亚洲人成在线观看图片 | 欧美福利视频导航| 久久综合九色综合97婷婷女人| 欧美国产小视频| 日本动漫理论片在线观看网站 | 久久都是精品| 国产日韩在线观看视频| 男操女在线观看| 欧美视频完全免费看| 成人免费精品视频| 亚洲精品一二三区区别| 欧美大片1688| 久草在线免费福利| 欧美亚洲国产怡红院影院| 成人久久18免费网站麻豆| 久久视频在线| 国产综合色区在线观看| 蜜桃tv在线播放| 欧美日韩精品一区二区三区| 26uuu亚洲| 99成人在线| 国产无遮挡裸体免费久久| 制服丝袜亚洲精品中文字幕| 9色porny自拍视频一区二区| 一区二区中文| 一区二区三区欧洲区| 成人免费高清| 69免费视频| 色综合久久综合中文综合网| 99re免费视频精品全部| 最新亚洲视频| 四虎影视精品| av成人亚洲| 欧美a在线看| 国产精品久久久久永久免费看| 欧洲激情一区二区| 亚洲天堂久久久久久久| 国产成人h网站| 亚洲巨乳在线| 久久综合欧美| 在线成人免费| 久久电影网站| 理论视频在线| 亚洲精品成人久久| 天天综合天天综合色| 久久你懂得1024| 免费不卡在线视频| 欧美99久久| 伊人春色精品| 在线欧美激情| 永久免费毛片在线播放| 国产爆初菊在线观看免费视频网站| 日韩成人久久久| 欧美主播一区二区三区美女| 亚洲品质自拍视频网站| 99v久久综合狠狠综合久久| 日韩电影在线看| 亚洲精品成人无限看| 乱亲女h秽乱长久久久| 国产精品伦一区二区| 91黄页在线观看| 欧美成人xxx| 日本a一级在线免费播放| 福利av痴女| 亚洲精品久久久久久久久久久| 欧美体内she精视频| 亚洲一区二区欧美| 国产精品麻豆久久久| 91蜜桃在线观看| 成人中文字幕电影| 精品一区二区三区免费毛片爱| 亚洲视频1区| 欧美日本不卡高清| 久久中文字幕av| 精品一区毛片| 天堂资源在线亚洲| 99a精品视频在线观看| 四虎精品永久免费| 少妇精品视频一区二区免费看| а√在线中文在线新版| av网站免费在线观看| 黄色网在线播放| av在线电影观看| yw193.com尤物在线|