获取到锁的jvm业务执行时间>过期key的时间如何解决?

文章探讨了在业务代码执行时间超过key过期时间的情况下,如何设计续命策略。提出了增量续命和全量续命的概念,以及在lua脚本中实现key的写入。同时,指出了潜在的死锁问题,强调了时间控制和续命次数限制的重要性。在出现多次续命仍无法完成业务逻辑时,应主动回滚事务并释放锁,保证系统的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务代码需要40s,过期key时间是30s,需要续命设计来解决。key使用lua脚本写入。

增量续命和全量续命:

延迟过期,比如延长过期时间=50s+,倒计时5s过期的时候,提前去检查线程,里面的业务逻辑代码是否执行完毕,没执行完毕就会将过期key时间延长。

这一方法的缺陷:

万一代码有bug,延长也会执行不完毕,那么一直执行不了,jvm02阻塞,产生死锁,因此需要做时间控制。

续命:开启一个定时任务实现续命,当我们业务逻辑没有执行完毕的时候,就应该延长过期 key 的时间。
一直不断实现续命的情况下,也会发生死锁的问题.设定续命的次数,续命多次如果还是没有执行完业务逻辑的情况下,就应该回滚业务、主动释放锁。

如果当前线程已经获取到锁的情况下,不需要重复获取锁,而是直接复用。

如何确保该锁是自己创建,被自己删除?
当我们在执行 set 的时候 value 为 uuid,如果删除的 uuid 与该 uuid 值保持一致,则是自己取的锁,可以被自己删除。

采用续命设计:
看门狗线程---续命线程
获取锁成功之后,应该提前开启一个续命的线程,检测如果当前业务逻辑还没有执行完毕的情况下,应该不断的延迟过期 key 的时间。
续命设计:死锁问题,限制次数
如果续命多次的情况下,还没有释放锁
1.主动回滚当前线程对应的事务
2.主动释放锁
3.主动将该线程通知
全局续命:
开启一个全局的线程 续命所有的过期 key, 不合理。

局部续命(增量续命)

代码:

 

 3次延长时间不成功后,就会进行业务的回滚。将01删除,进而唤醒jvm02。

今天就分享到这里了,喜欢的一键三连支持下!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值