您的位置:首页 >资讯 > 科技 >

【环球报资讯】针对RedisTemplate分布式锁实现WatchDog

2023-04-21 17:51:37    来源:腾讯云


(资料图片)

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

标签:

相关阅读

精彩放送

正宗笔画输入法 V8.01 破解版怎么样?正宗笔画输入法 V8.01 破解版有哪些功能?

【天天播资讯】RPGVXACE RTP_RPG制作大师运行库 V1.0 官方版怎么样?RPGVXACE RTP_RP...

全球快看:solid converter pdf V6.0中文破解版怎么样?solid converter pdf V6.0中文破解版有哪些功能?

天龙八部冰焰脚本答题卡 V7-180729A 官方免费版怎么样?天龙八部冰焰脚本答题卡 V7-18...

掌门人游戏平台 V12.07.11 官方绿色版怎么样?掌门人游戏平台 V12.07.11 官方绿色版...

Excel2003绿色精简版 32位/64位 免安装版怎么样?Excel2003绿色精简版 32位/64位 免安装版有哪些功能?

麦客疯 V7.0.0304 官方免费版怎么样?麦客疯 V7.0.0304 官方免费版有哪些功能?

今日热闻!SecureCRT8注册码生成器 V8.7.3 绿色免费版怎么样?SecureCRT8注册码生成器 ...

动态:“药茅”长春高新一季度核心业务收入下滑 不到两年时间股价跌去69.22%

久祺股份:已在美国沃尔玛、COSCO等线上平台销售公司自主品牌产品

如何修改图片像素 电脑如何修改图片像素-全球今亮点

锦西石化催化烟机运行创最高水平 环球看点

孩子充6000元打游戏,母亲找“客服”退款被骗15万……警方提醒!

用友BIP助力中国领先企业数智化国产替代

艾条熏屋子的正确方法是什么?艾条熏屋子的好处与功效是什么?

@太原人,成团的杨柳絮“火气大”一点就着,极易引发火灾

今日讯!谷雨至 农耕忙 全国春播进度近两成

世界时讯:池州市消保委发布“五一”消费警示

一季度我国造船三大指标市场份额保持全球领先|世界聚焦

4.21—秋末悔城:黄金震荡略显无奈,市场多空平分秋色

商业秘密保护湾区论坛落地南山,“南山特色”发挥引领作用 热推荐

天天动态:一份心愿书单的旅程(读书日特别报道)

全球看点:老古点金:黄金2010空吧

金融支持实体经济力度明显增强-通讯

拓展社区养老服务功能(健康焦点)

焦点讯息:【看税收走基层】从“浙”里出发,看税惠赋能高质量发展

淡水河谷任命能源转型金属业务首席可持续发展和企业事务官 热点

联合国就美国监听古特雷斯事件向美方表达关切

今日播报!怎样制作蛋糕的过程_怎样制作蛋糕

每日消息!索尼宣布收购Firewalk 助力开发线上服务型游戏

每日聚焦:跑图形火遍朋友圈!大运河畔跑“鸟头”,一路观鸟赏美景

天天新消息丨豪掷227亿!华润一日两城夺五地

淄博回应方舱改酒店传闻:目前没有 游客不适合住方舱|看点

美国重量级数据来袭、小心美元遭严重打压!黄金多头酝酿更大爆发 世界观焦点

教学教具有哪些_教具有哪些

天天观热点:用升级回收的法兰绒衬衫 DIY 连指手套

外汇界新一:黄金现在很温柔

【快播报】黄金现在很温柔

北京现代ix35油耗2.0l耗油吗_北京现代ix35油耗多少真实油耗|快报

每日精选:被小红书超热的CCD到底是啥?专业人士解读:淘汰技术、远不如手机

4月23日夜空将上演金星伴月奇观 北半球各地可见

全国5G和千兆光网“双千兆”网络应用案例数超5万

央行公布2023年第一季度拒收人民币现金处罚情况|今日视点

银河L7智爱座舱开启全家来电生活

天天微速讯:打造应用实践样板 工业互联网覆盖工业大类85%以上

公输班和鲁班是不是一个人?鲁班的四大发明是什么?

焦点快播:做个全身检查要多少钱女人_做个全身检查要多少钱

牺的组词_汉字牺的组词

阿东说金:上涨在给到更好的空 今日报

天天报道:何氏眼科:4月20日融资买入93.89万元,融资融券余额6070.84万元

最资讯丨方萍萍:2023年04月21日黄金交易策略

热文:黄金市场分析:美联储5月决议前,若震荡过后保持在1970美元之上,则后市有望创新高

智能音箱概念股震荡走强,漫步者午后涨停

各地深入挖掘农村内需潜力(权威发布)

FPG财盛国际:黄金仍处于悬崖边 仍需警惕大幅度抛售

环球快播:外交部发言人:敦促美国等发达国家审慎评估自身经济金融政策外溢影响

御赐小仵作楚楚真实身份是什么?楚楚的父亲云易是谁?

全球今亮点!涪陵电力:4月19日召开董事会会议

求好看的现代言情小说完本推荐_好看的现代言情小说完本推荐

盱眙房价二手房出售_盱眙房价

方达康冯文利,燕山深处的一颗璀璨的明珠

IMF首席经济学家:世界分裂为竞争集团代价巨大

外交部:以分裂世界为代价的所谓“团结”是危险的-天天快报

冯禧是哪年出生的?冯禧还在你好星期六吗?

生物医药板块跌1.31% 新莱应材涨5.85%居首

今头条!三文鱼等生鲜直抵成都 首条南美至中国全货机直飞生鲜航线5月开航

环球看热讯:一季度海南GDP达1775.96亿元 同比增长6.8%

雪中悍刀行王仙芝结局怎么样?雪中悍刀行王小屏结局如何?

董洁和梁朝伟合作过什么?跟董洁长得很像的是谁?

疲软美国数据鼓舞黄金多头!FXStreet首席分析师:若突破该位 金价料再飙升近35美元

全球今亮点!金宝:4.21黄金震荡走循环,日内2016不破看跌1980

深圳市今天教育与河南理工大学应急管理学院签订战略合作协议

天天观速讯丨全媒传播新探索 这场发布会值得期待

焦点速读:人民网评:“五个一百”,传递正能量、传播真善美

金界传奇:黄金反弹无力,现价2005平多反手空!

【天天播资讯】仙人掌什么时候会开花什么时候新掌的花期是多长_仙人掌什么时候会开花

艾紫馨:黄金白银多空交织  谨惕黑色星期五

头狼:隔夜黄金止盈2010一线,1998继续干多 世界简讯

环球播报:一图看懂易华录(300212.SZ)2022年全年业绩

【天天热闻】为何古代史籍很少记载强奸案?难道古人都特别正派?其实想多了

全国法院去年新收知识产权案件超52万件

预订火爆 产品丰富 “五一”旅游市场将迎高峰-观热点

资讯:著名主持人春妮患上厌食症,近照曝光颜值大跌,如今已成幕后人

监测记录到国家重点保护野生动物150种,上海将制定野生动物保护条例

环球热资讯!绿军再胜2-0老鹰!塔图姆29+10+6怀特26+7吹杨24分

天天观察:外交部发言人:希望韩方恪守一个中国原则,审慎处理台湾问题

最大起重量720吨!全球最大塔式起重机在湖南下线交付

世界看热讯:男子驾越野车进河道车辆被冲走,目击者:人被安全救出

MagicPad_魔板 V4.20 中文免费版怎么样?MagicPad_魔板 V4.20 中文免费版有哪些功能?|世界头条

天天新资讯:豌豆荚手机精灵 V2.80.0.7202 beta 抢鲜版怎么样?豌豆荚手机精灵 V2.80...

恩施市创新思路促管理——“三色”制度见真章 天天快资讯

国家税务总局电子申报工具 V1.1.26 官方版怎么样?国家税务总局电子申报工具 V1.1.26...

造梦西游5白云辅助 V1.0 官方最新版怎么样?造梦西游5白云辅助 V1.0 官方最新版有哪...

小望造梦西游4修改器 V2.1.11 官方最新版怎么样?小望造梦西游4修改器 V2.1.11 官方...

淘宝关键词排名查询工具 1.1 绿色免费版怎么样?淘宝关键词排名查询工具 1.1 绿色免...

每日报道:中国银行网上银行安全控件 V3.0.1.2 官方安装版怎么样?中国银行网上银行安...

全球通讯!京多安:吹停后基米希没必要从我身下抢球 期待与皇马的艰难对决

油脂又崩了!说好的五一行情呢? 环球观天下

最新消息:WPS Office 2012专业版 V8.1.0.3000 官方版怎么样?WPS Office 2012专业...

让爱延续,老人头宣传片引观众泪洒现场

今年一季度北京地区生产总值9947.7亿元 同比增长3.1%-当前热讯

百度输入法 V11.4.7 iPhone版怎么样?百度输入法 V11.4.7 iPhone版有哪些功能?

千彩手写识别系统 V7.6 官方最新版怎么样?千彩手写识别系统 V7.6 官方最新版有哪些功能?

深圳小爱应急救护培训中心,以热爱普及应急救护

股指 中长期资金可继续布局

一季度农业农村经济运行情况:稳步提升粮食产能 全面推进乡村振兴

天天快播:风险偏好主导短期债市情绪

时讯:隐波处于历史低位20230421