成人免费观看网欧美片-成人免费观看视频-成人免费观看男女羞羞视频-成人免费观看的视频黄页-成人免费高清视频-成人免费福利片在线观看

首頁(yè) > 娛樂(lè) >

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


(資料圖片)

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

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

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

/** * Title * * @ClassName: LockUtil * @Description:鎖工具類(lèi),通過(guò)內(nèi)部枚舉類(lè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;        /**         * 帶看門(mén)狗機(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;        //加鎖        /**         * 無(wú)看門(mén)狗機(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)看門(mén)狗                if (isDelay){                        if (LockUtil.isOpenCorn==false){                                //如果同一個(gè)項(xiàng)目之前打開(kāi)過(guò),那么先關(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);        }        //利用枚舉類(lèi)實(shí)現(xiàn)單例模式,枚舉類(lèi)屬性為靜態(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)鍵詞:

責(zé)任編輯:Rex_22

推薦閱讀
唔嗯啊欧美一级作爱网站| 沈陽43歲熟女高潮視頻| 国产成人综合亚洲AV第一页| 亚洲AV无码一区二区三区电影 | 日韩AV无码AV免费AV不卡| 国产精品女上位好爽在线| 亚洲人成亚洲精品| 欧美精品AⅤ一区二区三区| 国产V亚洲V天堂A无码| 亚洲精品无码专区在线| 欧美成妇人吹潮在线播放| 乖我们换个姿态再来一遍吧的小说| 亚洲AV永久无码精品国产精品| 蜜桃AV抽搐高潮一区二区| 草莓视频免费观看| 亚洲AV日韩AV无码AV一区二| 美女裸露双奶头尿口无遮挡网站 | 免费观看亚洲人成网站| 吃奶呻吟打开双腿做受动态图| 亚洲AV无码一区二区三区人| 免费播看高清大片免播放器一| 动漫精品啪啪一区二区三区 | 午夜DJ在线观看免费完整版社区| 久久久久久久久久久精品| 锕锕锕锕锕锕锕轻点好痛免费| 西西人体大胆午夜啪啪| 老熟女HDXXXX国产喷水| 东京热无码一区二区三区AV| 亚洲成AV人片天堂网久久| 女子初尝黑人巨嗷嗷叫| 国产精品久久久久秋霞鲁丝| 有人有在线观看的片资源| 日本真人边吃奶边做爽动态图| 黑人狂桶女人高潮嗷嗷叫小说| 6080电影网站| 午夜理论片2019理论琪琪| 两个男用舌头到我的蕊花| 国产97在线 | 传媒有限公司| 野花高清在线观看免费3| 日本高清WWW色视频| 精品国产亚洲AV麻豆尤物| JΑPΑNESEHD熟女熟妇伦| 亚洲AV无码无在线观看| 欧美人与动牲交XXXXBBBB| 国产亚洲AV无码AV男人的天堂| 亚洲AV永久无码精品蜜芽| 人妻丰满熟妇av无码区网站| 久久久精品国产SM调教网站| 国产老熟女精品一区熟女AV| 暴躁老姐的CSGO心得分享| 一本到在线高清视频| 午夜射精日本三级| 日本少妇人妻XXXXX18| 迷迷糊糊挺进岳身体| 加勒比一本HEYZO高清视频| 国产AV无码国产AV毛片| JAPANESE失禁潮喷| 影音先锋新男人AV资源站| 亚洲AV无码一区二区二三区软件| 少妇WWB搡BBBB搡BBBB| 欧美午夜性春猛交ⅩXXX| 久久亚洲AV成人无码精品| 国内精品九九久久精品 | 暗交小拗女一区二区三区| 与上司出轨的人妻| 亚洲成无码电影在线观看| 婷婷97狠狠色综合| 人人婷婷色综合五月第四人色阁| 美女裸体无遮拦国产兔费网站| 精品久久久久久狼人社区| 国产精华最好的产品人V中文| 办公室扒开奶罩揉吮奶头AV| 中文字幕亚洲无线码| 亚洲熟女一区二区三区| 亚洲AV色香蕉一区二区三区蜜桃| 少妇午夜AV一区| 人妻系列无码专区69影院| 免费污站18禁的刺激| 久久九九久精品国产| 国内精品一线二线三线黄| 国产精品岛国久久久久| 成人无号精品一区二区三区| AV天堂午夜精品一区| 曰韩欧美群交P片内射| 亚洲内射少妇AV影院| 亚洲AV成人片无码网站网8X| 婷婷五月综合缴情在线视频| 日韩在线看片免费人成视频播放| 欧洲免费无码视频在线| 美女高潮20分钟视频在线观看| 俄罗斯人和欧洲人长相区别| 一本一道久久综合久久| 无人区一码二码三码四码区| 日本熟妇色XXXXX| 美女裸体无遮挡免费视频| 狠狠婷婷色五月中文字幕| 西西人体444WWW高清大但| 熟妇女人妻丰满少妇中文字幕性生活 | 公司办公室的秘书3| 波多野结衣AV一区二区无码 | 日日噜狠狠噜天天噜AV| 麻豆果冻传媒新剧国产短视频| 孩子玩着玩着就进去了怎么回事| 俄罗斯13一14幻交| AV未满十八禁免费网站| 亚洲一区波多野结衣在线APP| 性少妇JEAⅠOUSVU片| 人善交VIDEO另类HD| 男女作爱免费网站在线观看| 久久不见久久见免费视频3| 国产日产免费高清欧美一区| 嗯啊开小嫩苞HHH好深男男| 777米奇色888狠狠俺去啦| 野花高清在线电影观看免费视频| 亚洲A∨国产AV综合AV麻豆丫| 熟妇高潮一区二区精品午夜无码| 欧洲无人区卡一卡二卡三| 两只奶头被老头吸肿了| 精品无码久久久久久久久水蜜桃| 国产农村一国产农村无码毛片| 丰满人妻被快递员侵犯的电影| CHINESE性老妇老女人| 在线观看免费AV网| 亚洲色精品一区二区三AI女星 | 成熟丰满熟妇高潮XXXXX| AV无码国产在线看免费APP| 呦系列视频一区二区三区| 亚洲男男GAY 18自慰网站| 性少妇JEAⅠOUSVU片| 我的妺妺h伦浴室无码视频| 日日狠狠久久偷偷色综合免费 | 看国产黄大片在线观看| 精品久久一区二区乱码| 国精产品一区一区三区糖心| 国产精品国产自线拍免费| 丰满人妻AV无码一区二区三区| 爆乳邻居肉欲中文字幕| AV电影在线观看| 2021影音先锋AⅤ资源男人网| 英语老师乖乖挽起裙子的意思| 亚洲色成人WWW永久在线观看| 亚洲国产精品久久久久久| 亚洲AV成人无码精品直播在线| 无码人妻少妇久久中文字幕| 四虎永久在线精品无码视频| 日韩乱码人妻无码中文字幕久久| 人妻有码ΑV中文字幕久久琪琪布| 欧美黑人又大又粗XXXⅩ| 男生把手放进我内裤揉摸好爽| 老赵抱着月月在厨房做视频| 久久久久亚洲AV无码专区网站 | 国产伦理一区二区| 国产二级一片内射视频播放| 国产AV一二三无码影片| 大香煮伊在2020一二三久| 成人看片黄APP免费看软件| 啊轻点灬大JI巴太粗熟妇| WINDOWS乱码的乱码大全| CHINA熟妇老熟女HD| 91人妻人人妻人人爽人人精品| 777亚洲熟妇自拍无码区| 2023无人区码一码二码三码| 最新在线精品国产福利| 欧美亚洲国产片在线播放 | 无码精品人妻一区二区三区ap| 久久久久精品国产亚洲AV| 好爽…又高潮了免费毛片| 国产精品国产三级国产AN| 国产成人人综合亚洲欧美丁香花| 国产AV永久精品无码| 国产SUV精品一区二区69| 国产成人亚洲精品青草天美| 国产极品美女高潮无套在线观看| 国产精品久久久久久影视| 国产女主播高潮在线播放| 国精产品砖一区二区三区糖心| 果冻十麻豆十天美十老师 | 多P混交群体交乱的安全保障| 粉嫩av.com| 国产DB624色谱柱36521| 国产精品久久久久9999小说| 国产喷水1区2区3区咪咪爱AV| 含紧一点H边做边走动| 精品人妻av无码一区二区三区| 久久久G0G0午夜无码精品| 久久人妻少妇嫩草AV蜜桃| 免费人成网WW555KKK在线| 欧美极品少妇XXXX亚洲精品| 人人妻人人澡人人爽人人精品| 日韩AV毛片无码免费| 撕开奶罩揉吮奶头高潮视频| 香蕉久久一区二区不卡无毒影院| 亚洲AV永久综合在线观看尤物| 亚洲另类无码专区丝袜| 伊人激情AV一区二区三区| 18无码粉嫩小泬无套在线观看| WWW亚洲精品自慰一区二区| 成 人 A V天堂| 国产丰满美女A级毛片| 国产最新无码AⅤ在线播放|