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

當(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)球信息

最新国产の精品合集bt伙计| 免费福利视频一区| 91欧美大片| 色噜噜狠狠一区二区三区果冻| 亚洲成人中文在线| 91首页免费视频| 亚洲精品免费电影| 欧美亚洲综合在线| 成年在线观看免费人视频| 久久精品论坛| 亚洲无吗在线| 国内精品久久久久影院色| 青青青爽久久午夜综合久久午夜| 欧美第一精品| 天堂va在线高清一区| 欧美精品第一区| 国产亚洲字幕| 精品国产导航| 一呦二呦三呦精品国产| 欧美香蕉爽爽人人爽| 韩国三级在线观看久| 日韩综合av| 日韩国产一区二区三区| 一区二区三区韩国免费中文网站| 欧美日韩国产探花| 91亚洲国产| 色豆豆成人网| 亚洲一区黄色| 成人激情小说乱人伦| 第一福利永久视频精品| www免费视频观看在线| 97se亚洲国产综合自在线 | 欧美国产一区视频在线观看| 欧美性色黄大片| 91久久奴性调教| 色综合久久久久网| 欧美视频自拍偷拍| 亚洲第一精品夜夜躁人人躁| 国产高清在线精品| 国产精品久久久久天堂| 日韩av午夜在线观看| 日韩午夜电影| 日韩精品电影在线观看| 在线观看网站黄不卡| 国产网站在线免费观看| 日韩在线影院| 欧美日韩一本| 国产99久久久精品| 日韩在线a电影| 蜜臀久久久久久久| 色欧美88888久久久久久影院| 国产视频三级在线观看播放| 亚洲18在线| 国产乱子轮精品视频| 少妇性bbb搡bbb爽爽爽欧美| 亚洲狠狠婷婷| 亚洲欧美一区二区三区在线播放| 亚洲国产免费看| 欧美日韩精品一区二区天天拍小说| 大胆av不用播放器在线播放| 在线日韩一区| 欧美日韩精品一本二本三本| 久久综合给合久久狠狠狠97色69| 亚洲国产视频网站| 黄网站在线免费| 一呦二呦三呦精品国产| 成人av色网站| 亚洲无线一线二线三线区别av| 不卡av电影在线播放| 91在线视频免费看| 九一亚洲精品| 国产亚洲美州欧州综合国| 免费一级网站| 高清美女视频一区| 午夜免费视频在线国产| 久久国产影院| 专区另类欧美日韩| 黑粗硬长欧美在线视频免费的| 一区二区精彩视频| 成人欧美一区二区三区1314 | 美女黄a一级视频| 大伊香蕉精品在线品播放| 免费在线观看成人| 欧洲精品一区二区| 欧美成人黑人| 丝袜亚洲另类欧美| 久久新电视剧免费观看| 日韩av在线看| 国产不卡av一区二区| 亚洲欧美怡红院| 综合激情网...| 精品sm在线观看| av网站在线免费看推荐| 91青青国产在线观看精品| 亚洲欧洲韩国日本视频| a天堂资源在线| 成人福利视频网站| 两个人看的免费完整在线观看| 每日更新在线观看av| 琪琪久久久久日韩精品| 有码一区二区三区| 成年男女免费视频网站不卡| 欧美喷水一区二区| 蜜臂av日日欢夜夜爽一区| а√中文在线8| 色综合视频在线观看| 黄色激情网站| 亚洲欧美自拍偷拍| 亚洲欧美tv| 色综合欧美在线| 国产另类xxxxhd高清| 欧美一级播放| 日韩资源在线| 美女尤物久久精品| 91精品国产一区二区三密臀| 国产精品入口66mio| 午夜精品在线视频一区| 超碰在线观看免费版| 另类中文字幕网| 亚洲女同av| 亚洲国产高清福利视频| 欧美高清视频看片在线观看| 日韩欧美成人精品| 久久精品黄色| 精品久久香蕉国产线看观看亚洲| 欧美精品尤物在线观看| 一区二区三区区四区播放视频在线观看| 国产大陆a不卡| 一区二区三区日本视频| 亚洲国产成人一区二区三区| 番号集在线观看| 午夜一级在线看亚洲| 丁香婷婷自拍| 国产亚洲精品自拍| 欧美三级中文字幕| 亚洲精品mv| 粉嫩嫩av羞羞动漫久久久| 精品一区二区三区三区| 国产精品一区二区精品| 国产jizz| 久久精品在线免费观看| 亚洲精品成人久久电影| 亚洲精品成人影院| aaa大片在线观看| 欧美午夜视频在线观看| 激情综合久久| 国产一区二区影视| 偷窥国产亚洲免费视频 | 亚洲欧美一区二区三区在线播放| 国产精品资源在线观看| 国产精品**亚洲精品| 欧美久久高跟鞋激| 国产精品久av福利在线观看| 欧美一级黄色录像| 亚洲免费在线| 国产精品1区| 成人看av片| 91大神影片| 久久久久久99久久久精品网站| 久久久久伊人| 亚洲图片欧美| 欧美日韩一级二级| 国产精品久av福利在线观看| 日韩欧美在线123| 国产日韩欧美一区二区三区综合| 日韩伦理视频| 大地资源中文在线观看免费版| 国产高潮av| 免费av片风间由美在线| 日韩欧美一区在线观看| 精品国精品国产尤物美女| 91久久久免费一区二区| 亚洲国产日韩a在线播放性色| 五月激情综合婷婷| 国产99久久久国产精品| 亚洲aa在线| 精品亚洲a∨| 日韩精品免费在线视频| 欧美一二三区在线观看| 国产精品三级视频| 欧美一区不卡| 狠狠色丁香婷婷综合影院| 成人性生活视频| 最新中文字幕av专区| 欧美日韩免费在线视频| 一区二区三区色| 国产三级精品视频| 亚洲另类在线制服丝袜| 国产精品伦一区二区三级视频| 午夜精品电影| 国产九一精品| 无码日韩精品一区二区免费| 一区二区三区四区视频免费观看 | 一区二区三区日本视频| 亚洲男人在线| 蜜桃精品wwwmitaows| 国内精品久久久久久99蜜桃| 久久亚洲黄色| www.26天天久久天堂| 依依成人在线|