天天讯息:针对RedisTemplate分布式锁实现WatchDog
2023-04-22 14:32:26来源:腾讯云
(相关资料图)
在此之前,去看了下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; }}
责任编辑:hnmd003
相关阅读
-
天天讯息:针对RedisTemplate分布式锁实现WatchDog
在此之前,去看了下Redission的实现原理,不过在开发中,原本的代码使用RedistTemplate实现的,也不太想换
2023-04-22
相关阅读
-
天天讯息:针对RedisTemplate分布式锁实现WatchDog
在此之前,去看了下Redission的实现原理,不过在开发中,原本的代码使用RedistTemplate实现的,也不太想换
-
聚焦:来自40万米高空的凝望!200余颗在轨遥感卫星守护“美丽中国”
近年来,我国遥感卫星进入快速发展期,特别是过去十年,在遥感卫星技术自主化方面,我国从数量、质量上均迈
-
世界地球日 建设美丽家园我们作了这些努力→
近年来,为了建设美丽家园我们作了哪些努力?一起来看。
-
全球即时看!京东科技高管再调整,徐丰升任京东科技总裁
品玩4月21日讯,据钛媒体报道,消息称京东科技销售中心负责人徐丰近日升任京东科技总裁一职,直接向CEO李娅
-
周鸿祎内部信:360 员工不会被 GPT 淘汰_每日播报
品玩4月21日讯,360集团创始人周鸿祎今天下午发布内部信,主题为三六零人工智能总动员。周鸿祎在内部信中表
-
世界观热点:特斯拉 300 万美元索赔案胜诉,洛杉矶法院裁定辅助驾驶系统 Autopilot 未失去安全性能
品玩4月22日讯,据36氪报道,当地时间4月21日,美国洛杉矶高等法院的陪审团针对居民JustineHsu一项2020年提
-
cad2019怎么加载字体_cad如何加载字体
今天小编肥嘟来为大家解答以上的问题。cad2019怎么加载字体,cad如何加载字体相信很多小伙伴还不知道,现在
-
今日精选:喜事新办 移风易俗有创意
原标题:喜事新办移风易俗有创意(深阅读·关注婚俗改革)核心阅读婚俗礼仪与时俱进,文明新风吹拂城乡...
-
粗盐热敷和热水袋热敷的区别?
二者的主要区别如下:第一、材质不一样:其中粗盐热敷是把粗盐加热后放在布袋里垫敷;而热水袋热敷是通过高
-
再捐1亿元种树治沙:蚂蚁集团持续七年支持内蒙古生态治理_全球独家
鞭牛士报道 今天(4月22日)是“世界地球日”,内蒙古自治区林草局与蚂蚁集团启动战略合作:由蚂蚁集团...
-
苹果MacBook组装商广达将投资1.2亿美元在越南建电脑制造厂
据新浪财经消息,苹果MacBook组装商广达将在越南南定省投资1 2亿美元建厂,预计入驻南定省美顺工业区,
-
这是一个不能流浪的地球
我们只有一个地球,共有一个家园。一起努力,珍爱这个不能流浪的地球。
-
360 申请 CHAT360 商标
品玩4月21日讯,天眼查App显示,近日,北京奇虎科技有限公司申请注册多枚360AI360智脑CHAT360360GPT等商标
-
三星云宣布 7 月 3 日起终止云盘音乐 / 文件恢复功能,并删除相关用户数据-世界快讯
品玩4月21日讯,据IT之家报道,三星云近日发布邮件公告,表示将从7月3日起终止云盘音乐 文件恢复功能,并同
-
国内用户无缘!iOS 17 将支持三方应用商店或仅限欧洲:苹果准备收费
快科技4月22日讯,去年11月,欧盟颁布了数字市场法案,其中要求苹果设备要允许安装非AppStore的应用软件,
-
无痛诊疗再添“主力军” 淄博莲池妇婴医院无痛胃肠镜专区正式开诊
“什么感觉也没有,一眨眼检查就做完了!”4月21日上午,在淄博莲池妇婴医院“呵护胃肠·全民行动”无痛...
-
2jd级车厘子有多大?
2jd车厘子28mm-30mm大。2JD车厘子一般指JJD级的车厘子。XL级车厘子的果粒直径为24mm-26mm,J级车厘子的果粒
-
世界讯息:百亿交易再起波澜,沙钢起诉复星冻结南钢11%股权 !复星:罔顾事实滥用诉权
围绕南京南钢钢铁联合有限公司(下称“南京钢联”)控制权的争夺再起波澜。继中信集团出手“截胡”,导...
-
世界播报:退保第三方用的什么手段?有什么好处?
专业的谈判技巧:作为中立的第三方,退保机构会派遣有丰富经验和专业知识的谈判人员与保险公司代表进行协商
-
观天下!我们都是炎黄子孙③ | 海外七大华人姓氏起源地都在河南
在海外华人中,流行着两种说法。一个是“陈林半天下,黄郑排满街”,一个是“陈林李许蔡,天下占一半”...
-
精选!将水果添加到饮料中会保持酒精吗?
西瓜坚硬的外皮会保留您倒入其中的酒精。对于大多数人来说,水果是一种清爽、甜美且健康的零食。大多数水果
-
“五一”假期热门旅游城市出炉!有你的目的地吗?
火热的“五一”假期越来越近,不少人都在计划着一场旅行。今年“五一”期间哪些城市最热门?一起来看看吧。
-
“五一”旅游热度持续高涨 预订火爆 焦点快看
旅游市场普遍反映,今年“五一”旅游市场需求释放得格外早,而且热度持续高涨。
-
PICO 将适配英特尔锐炫 A750/770 显卡_当前最新
品玩4月21日讯,据pico官方消息,pico将对英特尔锐炫A系列显卡进行了串流的适配。拥有英特尔锐炫A770 A750
-
顺丰航空开通“鄂州 = 德里”国际货运航线
品玩4月21日讯,据顺丰官方消息,顺丰航空鄂州=德里国际货运航线正式开通运行。鄂州=德里国际货运航线由顺
-
致敬经典 性价比超高 雷柏 V300W 无线游戏鼠标到手价仅 169 元 天天微动态
前段时间雷柏发布新品V300W无线游戏鼠标,新品的设计语言与早年雷柏V300有线鼠标有着家族关系。这款经典复
-
二手房参考价政策要退出历史舞台?深圳仍有二手豪宅成交价较参考价高出 17 万元 / 平
深圳各银行告别二手房参考价的消息,让原本稍显沉寂的楼市瞬间沸腾了起来。作为全国首个率先执行二手房参考
-
新消息丨“公奔私”又热了!公募派私募哪家强?五年回报超 1000% 最亮眼
财联社4月22日讯(记者吴雨其)在大资管行业发展浪潮下,基金经理公奔私一直是公众热议的话题。Wind数据显
-
美股恐暴跌超 50%、银行业动荡还未结束!传奇投资人拉响警报_环球热头条
财联社4月22日讯(编辑黄君芝)曾成功预测三次市场泡沫的传奇投资人JeremyGrantham日前警告称,投资者需准
-
苹果版“余额宝”将暴击传统银行!穆迪发出警告 今日最新
财联社4月22日讯(编辑黄君芝)本周,苹果与美国投行高盛集团合作的AppleCard高收益储蓄账户正式上线了。穆
精彩推荐
阅读排行
精彩推送
- 服务器温控方兴未艾 龙头喊出“...
- NBA又有一组1-2,还有0-3!东部...
- 物业新形态样本:时代邻里陵水项...
- 月入过万是什么水平:一季度20个...
- 全额退保险的诀窍是什么?要怎么...
- 安行宝两全保险可以退保吗?能不...
- 平安财富鑫生年金保险退保怎么算...
- 理财保险退款后多久可以到账?划...
- 平安福保险退保比例是多少?划算...
- 4月21日公开课19:30,前沿课题一...
- 天天最新:特斯拉300万美元索赔...
- 长峰医院涉嫌违规合作开展养老业...
- 天天快资讯丨车展E快评 | 补足...
- 特斯拉季度营收超两百亿 / 宁...
- 国内首个类 ChatGPT 模型:复...
- 华为将发布全新分销品牌|天天日报
- “史上最强火箭”炸了,但人类仍...
- 收金519亿 上海首轮土拍收官!...
- 三六零:2022年安全业务持续增长...
- 安邦保险怎么样?有哪些险种?
- 环球速讯:投融精准对接,推动金...
- 孩子上保险真的有必要吗?可以投...
- 淄博“烧烤贷”出圈!多家银行推...
- 众安百万医疗险基础版B是什么?...
- 焦点信息:太平洋保险公司电话是...
- 三轮车保险网上买怎么买?要什么...
- Keep打造国内首个瑜伽垫环保操场...
- 世界看点:ChatGPT刺激对芯片需...
- 美国网约车公司Lyft确认将大幅裁...
- 不用再排队!深圳地铁上线新票种