国产精品天天看_欧美另类高清zo欧美_国产精品视频yy9299一区_日韩电影中文字幕一区

當前位置    :     網站首頁    /     應用 > 詳情頁

針對RedisTemplate分布式鎖實現WatchDog-熱資訊

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


【資料圖】

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

標簽:

電腦

硬件

電競

數碼

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

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

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

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

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

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

主站蜘蛛池模板: 丝袜亚洲欧美日韩综合| 国产欧美在线播放| 欧美激情网友自拍| 日本亚洲欧美三级| 国产精品亚洲天堂| 日本一区二区三区在线播放| 国产a∨精品一区二区三区不卡| 欧美激情精品久久久| 色婷婷精品国产一区二区三区| 国产精品久久久一区| 蜜臀久久99精品久久久酒店新书| 日韩有码在线播放| 亚洲a中文字幕| 国产精品入口福利| 国产在线视频不卡| 九九九九九九精品| 日韩精品在线中文字幕| 国产精品日韩高清| 日韩久久久久久久| 亚洲国产欧美不卡在线观看 | 国产精品入口免费| 久久免费观看视频| 欧美中日韩一区二区三区| 国产二区视频在线| 久久精品99久久久香蕉| 久久在线中文字幕| 久久久福利视频| 久久精品国产2020观看福利| 久久精品视频播放| 精品久久久久久久免费人妻| 国严精品久久久久久亚洲影视| 久久天天狠狠| 精品一区二区三区自拍图片区| 国产综合第一页| 国产日韩欧美视频在线| 久久国产精品亚洲va麻豆| 精品国模在线视频| 欧美中日韩在线| 久久本道综合色狠狠五月| 国内一区二区在线视频观看| 国产欧美日韩精品在线观看|