redis 分布式锁 看门狗_redis分布式锁自动延长过期时间

本文介绍了如何在项目中实现Redis分布式锁的自动延长过期时间功能。通过保留自定义设置过期时间的选项,当未设置过期时间时启动自动延长。在加锁时设置延长过期时间,并通过定时任务每隔一定时间重新设置过期时间,同时限制最大延期次数,以防止长时间占用锁。文章还涉及到加锁、续期、释放锁的详细过程,以及注解改造的实现。
摘要由CSDN通过智能技术生成

b75359a5fcef1d0035529f15f4838d07.png

点击上方 " JudyGirl "关注, 星标或置顶一起成长 作者 : noname 来源: https://segmentfault.com/a/1190000037526623?utm_source=tuicool&utm_medium=referral

背景 项目组已经有个 分布式锁 注解(参考前文《记一次分布式锁注解化》),但是在设置锁过期时间时,需要去预估业务耗时时间,如果锁的过期时间能根据业务运行时间自动调整,那使用的就更方便了。

思路 思路参考了 redisson :

保留原先的可自定义设置过期时间,只有在 没有设置过期时间(过期时间为默认值 0) 的情况下,才会启动自动延长。申请锁时,设置一个 延长过期时间 ,定时每隔 延长过期时间 的三分之一时间就重新设置 过期时间 ( 时期时间 值为 延长过期时间 )。为了防止某次业务由于异常而出现 任务持续很久 ,从而长时间占有了锁,添加 最大延期次数 参数。加锁 用一个 Map 来存储需要续期的 任务信息 。在加锁成功之后将 任务信息 放入 Map ,并启动延迟任务,延迟任务在执行 延期动作 前先检查下 Map 里锁数据是不是还是被当前任务持有。每次续期任务完成并且成功之后,就再次启动延迟任务。申请锁 复用之前的 加锁 方法,把 延长过期时间 作为 加锁过期时间 。


public Lock acquireAndRenew(String lockKey, String lockValue, int lockWatchdogTimeout) {
return acquireAndRenew(lockKey, lockValue, lockWatchdogTimeout, 0);
}

public Lock acquireAndRenew(String lockKey, String lockValue, int lockWatchdogTimeout, int maxRenewTimes) {
if (lockKey == null || lockValue == null || lockWatchdogTimeout <= 0) {<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值