
针对RedisTemplate分布式锁实现WatchDog_全球热头条
2023-04-21 00:14:02 来源:腾讯云
【资料图】
在此之前,去看了下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; }}
标签:
业界
更多
-
20
2023-04赌王三太被称赞气质超群 不愧是赌王看上的女人 焦点讯息
4月18日,何超莲和窦骁的世纪婚礼举行,两个人低调很久,不愿意透露半点消息,只能从一些路透来看一些婚礼 -
20
2023-04sasan矿山(sasan)
1、XSS的内存真的很失望。那并不容易去补偿,严重降低了次世代多平台的基础配置。相比之前的世代,这一次的 -
20
2023-04一男性游客被指逼哭工作人员 上海迪士尼:涉事者被终身禁入
一男性游客被指逼哭工作人员上海迪士尼:涉事者被终身禁入 -
20
2023-04满易贷网贷逾期3天征信有什么影响
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后 -
20
2023-04【天天新要闻】皇马队内欧冠最高速排行榜:巴尔韦德36.3km/h第一,维尼修斯第二
欧足联官方数据统计显示,巴尔韦德是皇马本赛季欧冠跑动速度最快的球员。附皇马欧冠最高时速排行榜:1-巴尔 -
20
2023-04美国得州一湖中接连出现浮尸:今年已有4起 30岁男子疑是攻击目标 今日讯
美国得州奥斯汀鸟湖接连出现浮尸(图:《纽约邮报》)海外网4月20日电据《纽约邮报》19日报道,美国得克萨 -
20
2023-04泸州市、璧山区消委联合举办川渝比邻地区首届消费维权能力提升培训班
为提升消费维权一线工作人员消费投诉处理能力和水平,4月18日,泸州市消委与重庆市璧山区消委联合举办了川 -
20
2023-04世界快看点丨进军欧洲,数字王国携手Mastercard OFF CAMERA国际独立电影节
进军欧洲,数字王国携手MastercardOFFCAMERA国际独立电影节 -
20
2023-04养老金缴费基数有什么用?缴费基数越高越好吗?
养老金缴费基数有什么用?缴费基数越高越好吗?社保网小编介绍养老金缴费基数知识。养老金的计发基数,是按 -
20
2023-04探究酵母菌呼吸方式(酵母菌的生殖方式) 世界信息
一、题文酵母菌的生殖方式是( )A 分裂生殖B 孢子生殖C 营养生殖D 出芽生殖或有性生殖二、解答酵母菌属 -
20
2023-04河北农业大学2023年硕士研究生调剂考生复试成绩 每日头条
从河北农业大学获悉,河北农业大学2023年硕士研究生调剂考生复试成绩已发布,如下:河北农业大学2023年硕士 -
20
2023-04全球新动态:dota2更新不了了_dota2更新不了
1、打开steam软件,登录你的账户。如图所示。2、单击steam中的set命令。如图所示。3、进入下载选项卡。如图所示
手机
更多

使用墨镜或太阳镜看手机屏幕时,常常会出现部分屏幕变得黑漆漆一片的情况,给使用带来了不便。苹果最近获得了一项专利,可以解决这个问题。
2023-03-24

苹果考虑将iPhone系列进一步延伸 2024年上市?
苹果正在考虑将iPhone的Pro系列进一步向上延伸,一位可靠的泄密者的报告坚称它可能会在2024年上市。自 2022 年年中以来的传言提出了苹果
2023-02-07

卷出一块好曲屏 真我10系列新品发布会举行
11月17日下午,真我realme举行主题为卷出一块好曲屏的真我10系列新品发布会,正式推出全新一代科技越级代表作真我10系列的三款新品以及真我
2022-11-17
英国猴痘病例数预计将大幅上升
人民网伦敦5月22日电 (余颖)截至5月20日,英国确诊猴痘病例总数上升至20例。由于猴痘病毒在英国已经开始社区传
2022-05-24
上海:视情适当延长毕业生在校生身份时间
人民网北京5月23日电 (记者孙竞)据上海市教委政务微信"上海教育"消息,为做好2022届高校毕业生就业创业工作,
2022-05-24
国家电网确定新型电力系统科技攻关十大重点项目
5月19日,国家电网新型电力系统科技攻关行动计划2022专项重大科技项目责任状签订视频会议在京召开。国家电网公司
2022-05-24
比亚迪发布CTB电池车身一体化技术
5月20日,比亚迪发布了CTB电池车身一体化技术及首款搭载了CTB技术的e平台3 0车型。比亚迪CTB电池车身一体化技术简
2022-05-24
商务部:坚定致力于实现全面、高水平的亚太自贸区
人民网北京5月23日电 (记者赵竹青)据商务部网站消息,21至22日,亚太经合组织(APEC)举行第二十八届贸易部长
2022-05-24
中办国办印发《意见》 推进实施国家文化数字化战略
新华社北京5月22日电近日,中共中央办公厅、国务院办公厅印发了《关于推进实施国家文化数字化战略的意见》(以下
2022-05-24
初夏看市场:“菜篮子”产品生产供应充足 蔬菜在田面积达9877.2万亩
人民网北京5月23日电 (记者李栋)据农业农村部最新发布,我国主要“菜篮子”产品生产供应充足,当前蔬菜在田面
2022-05-24
上海浦东重点生产企业复工复产超1100家
新华社上海5月22日电(记者杨有宗)记者22日从上海市浦东新区获悉,浦东新区企业复工复产持续推进,截至目前,在
2022-05-24
测评
-
1
Intel最新处理器Arrow-S曝光 最高可达24核
-
2
配置拉满的电竞神机 雷神ZERO2023大黄蜂发布
-
3
真我10Pro系列发布 首发量产2160Hz超高频调光技术
-
4
阿富汗塔利班组建正规军
-
5
萨赫勒地区反恐形势面临新变数
-
6
北约北扩加剧欧洲安全风险
-
7
贵州毕节七星关区百所学校创办百个“红军班”
-
8
湖北省孝感军分区组织军地联合应急救援研究性演练
-
9
青藏高原等区域将新设一批国家公园
-
10
河北省承德军分区退役军人担纲教练主力
软件
数码