业务代码需要40s,过期key时间是30s,需要续命设计来解决。key使用lua脚本写入。
增量续命和全量续命:
延迟过期,比如延长过期时间=50s+,倒计时5s过期的时候,提前去检查线程,里面的业务逻辑代码是否执行完毕,没执行完毕就会将过期key时间延长。
这一方法的缺陷:
万一代码有bug,延长也会执行不完毕,那么一直执行不了,jvm02阻塞,产生死锁,因此需要做时间控制。
续命:开启一个定时任务实现续命,当我们业务逻辑没有执行完毕的时候,就应该延长过期 key 的时间。
一直不断实现续命的情况下,也会发生死锁的问题.设定续命的次数,续命多次如果还是没有执行完业务逻辑的情况下,就应该回滚业务、主动释放锁。
如果当前线程已经获取到锁的情况下,不需要重复获取锁,而是直接复用。
如何确保该锁是自己创建,被自己删除?
当我们在执行 set 的时候 value 为 uuid,如果删除的 uuid 与该 uuid 值保持一致,则是自己取的锁,可以被自己删除。
采用续命设计:
看门狗线程---续命线程
获取锁成功之后,应该提前开启一个续命的线程,检测如果当前业务逻辑还没有执行完毕的情况下,应该不断的延迟过期 key 的时间。
续命设计:死锁问题,限制次数
如果续命多次的情况下,还没有释放锁
1.主动回滚当前线程对应的事务
2.主动释放锁
3.主动将该线程通知
全局续命:
开启一个全局的线程 续命所有的过期 key, 不合理。
局部续命(增量续命)
代码:
3次延长时间不成功后,就会进行业务的回滚。将01删除,进而唤醒jvm02。
今天就分享到这里了,喜欢的一键三连支持下!