针对RedisTemplate分布式锁实现WatchDog_当前报道
(资料图片)
在此之前,去看了下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; }}
标签:
推荐文章
- 针对RedisTemplate分布式锁实现WatchDog_当前报道
- 讯息:开封市鼓楼区医疗保障局举行2023年医保基金监管集中宣传月活动启动仪式
- 哈登:不知道什么是二级恶意犯规 被驱逐的感觉糟透了! 快看点
- 重点聚焦!超深!超高温!这口井开采刷新国内多项纪录!
- 简单有寓意的网名两个字_简单有寓意的网名
- 头条焦点:工信部:我国工业互联网核心产业规模超过1.2万亿元
- 【全球新要闻】这就是信心丨数据带你提前感知这个“五一”假期有多火!
- 【世界播资讯】肉鸽养殖技术电子书_肉鸽养殖技术
- 日本政府考虑取消重要人物街头演讲 改为室内进行:热议
- 体坛:国足与亚运队达共识,6月热身赛超龄球员将与亚运队磨合|当前速读
- 全球消息!怀化:各地联动整治“自媒体”乱象 曝光一批典型案例
- 天亿马:2022年年归母净利同比下滑28.92%,智慧政务领域收入下降26.27% 每日信息
- 差额选举和等额选举的区别在于_差额选举和等额选举的区别
- 世界关注:欧冠赔率:曼城居首拉开皇马 米兰德比蓝黑更占优
- 环球新消息丨北京人艺表演学员培训班再开班,濮存昕开讲第一课
- 「世界说」美国中东影响力衰落 沙特媒体:以美国自身为中心的做法不再被地区国家接受
- 康恩贝:4月20日融资买入2968.05万元,融资融券余额4.31亿元-焦点要闻
- 英国g5大学英文简称_英国g5大学-全球播报
- 百事通!警惕网络收费荐股!粉丝轻信大V,2个月跌去60万……
- 今年铁拳行动重点打击8类违法行为,涉及刷单炒信、“傍名人”等 环球报道
- 对未来刀剪行业消费需求以及竞争格局的看法?张小泉这样回答
- 巴萨跟队:梅西回归概率80%巴萨让2名重要球员离队+其他人降薪
- 测试音响效果专用音乐 音乐淡入淡出效果制作软件_世界速讯
- 都在一起8年了,他们还是得不到大家的祝福?-天天快讯
- 世界看点:马斯克建议政府管控超级人工智能:可以拔电源,机器人不应得到平等对待
- 中交房地产退出江西丹越地产,退出前持股75%_世界视点
- 焦点热议:广州市卫生防疫站联系方式_广州市卫生防疫站
- 新天钢联合特钢用氢能重卡打通环保创A“最后一公里”-天天热讯
- 濮阳:48户居民期盼饮上“丹江水”
- 官宣!AC米兰续约,红鸟松口,450万年薪,射手王留队,马队神了
- 从广交会看我国外贸新趋势
- 蔡司质感人像大片!vivo X Flip搭载5000万像素大底主摄 自带OIS防抖
- 沃森生物:获得新型冠状病毒变异株mRNA疫苗Ⅲ期效力临床试验期中分析主要结果
- 五一长沙铜官窑古镇烟花几点放?
- 焦点!2023年“铁拳”行动重点打击“刷单炒信”等8类违法行为
- 今日要闻!华为第20届分析师大会,孟晚舟分享数字化转型三个核心洞见
- 【世界独家】2022年全国法院审结各类知识产权案件54万余件
- 披着“羊皮”的狼,终将被围猎!:环球快播
- 颜值也是战斗力:EVA联名款ROG电竞路由不可错过
- 邯郸植发医院有哪些
- 6月初成都大运会全面启动赛事门票销售|全球观速讯
- 蚂蚁庄园支付宝问答:小鸡庄园今天答案7.12
- 3-1!3-2!冠军赛3大冷门诞生:国乒3人出局,阻击张本智和失败_世界播报
- 浏阳澄潭江镇:“睦邻里”筑牢汛期安全防线 世界报道
- 全球最新:加拿大通胀率实现近19个月以来最小增幅
- 今日观点!《何以为家》观后感600字 观后感600字
- 【新视野】“2022湖北青年影像奖”拟获奖人选公示
- 中国市场监管报:郑渊洁老师“告别”的锅,商标不背-世界微头条
- 关晓彤连续六年为鹿晗庆生 两人文案相呼应超甜
- 赛微电子:国家集成电路基金拟减持不超2%股份:环球热文
- 要闻:退休职工涨工资最新信息_退休职工
- 今日国际金价实时行情(2023年4月19日)
- 阳光人寿北京分公司快速应对 北京长峰医院火灾事故 每日热议
- 菲外长解释:不会允许美国在菲军事基地存放用于涉台海行动武器 热门看点
X 关闭
最新资讯
- 适合短线投资的方式有哪些?
- 湖北:35条新举措“全周期”呵护个体户
- 世界最新:普通话的由来 普通话的由来简单介绍
- 利亚德:公司将在定期报告中披露对应时点股东人数
- 彩讯股份(300634)4月19日主力资金净买入8295.38万元 天天要闻
- 畅通交互渠道,招商银行威海分行举办银企对接活动|世界即时看
- 黑色持仓日报:期螺下跌,中信期货增持8千手空单 全球观焦点
- 夫妻吵架男子负气出走 民警全力找回调解劝和-世界简讯
- 快消息!江河集团(601886)4月20日主力资金净卖出797.36万元
- 南宁马山县:乡村振兴共助力 爱心捐赠暖人心 环球热点
- 每日播报!A股开盘速递 | 沪指低开0.09% 旅游、游戏股回调 国泰君安:看好银行股修复行情
- 车主查询电话_车主查询
- 观热点:世上哪有成功学
- 天天微动态丨“能立多爱宝中国行”公益行动圆满收官,高能营养助力山区儿童成长
- 武汉白沙洲夜市_沙洲夜市_资讯推荐
- 北京开展规范旅游市场价格秩序专项执法行动
- 英里_关于英里的简介 当前热讯
- 中国石油和化学工业联合会:石化行业碳达峰实施计划将很快发布
- 牛肉汤锅的家常做法_如何做牛肉汤锅
- 世界微资讯!整体进度快、增长空间大:数字基建扩容提速
- 港股异动|联邦制药(3933.HK)涨超7%司美格鲁肽注射液体重管理适应症药物临床试验获批:每日动态
- 全省法院“陇原风暴”执行行动在兰启动
- LPR连续9月不变!1年期LPR为3.65%,5年期以上LPR为4.3%|天天报资讯
- 12368案件查询码几位_12368案件查询码_今日热门
- 当前关注:川朴的作用以及功效_川朴含有厚朴类物质
- 全球央行大举购金,释放什么信号?_焦点要闻
- 神奇宝贝精灵图册_神奇宝贝精灵图片大全
- 世界聚焦:驱动升级有用吗 驱动升级
- 新精武门武魂电影_新精武门武魂_环球速看
- 湘邮科技(600476)报收于18.69元,下跌3.16%
- 华福证券给予安科瑞持有评级 能耗管控需求提升 掘金微电网蓝海
- 全球视讯!“引擎”加速,中国经济活力竞涌(中国经济,开局跑出新气象)
- 这才是季后赛76人再胜篮网的原因,原来是这几件事造成的
- 弥勒旅游景点大全_弥勒旅游攻略必去景点
- 世界微速讯:4月19日西安旅游涨停分析:旅游,创投概念热股
- 4月19日 10:42分 科瑞思(301314)股价快速拉升
- 【环球速看料】什么药膏去疤痕最好最有效_什么药膏去疤痕最好
- 读书破万卷下笔如有神的意思是什么_出自何典
- 东兴证券(601198)4月19日主力资金净卖出1517.88万元
- 美银行业:美国经济疲软 消费者开始拖欠信贷还款:焦点滚动
- 俄乌总统先后到访前线 释放什么信号 具体详细内容是什么
- 推特广告收入或急剧下滑 马斯克呼吁广告主回归
- 环氧带锈防锈漆的特性-世界即时看
- 江苏银行发布自研大语言模型平台 实现客服场景首次应用
- 郑州植得口腔医院正规吗?公立or私立?附医保信息及门店地址一览
- 单体能量密度高达500Wh/kg!宁德时代发布凝聚态电池:断层式领先_每日焦点
- 焦点报道:发改委:将研究合理缩减外资准入负面清单
- 焦点热讯:1GHZ等于多少THZ 1Ghz等于多少hz
- 上海证券给予风语筑买入评级,风语筑2022年报点评:深化布局AI,订单有望高增长
- 天天即时看!“我手机里的短信大多是垃圾短信” 专家:完善技术手段提升识别拦截能力
X 关闭