自动延期时间 php,redis分布式锁自动延长过期时间

本文介绍了如何实现一个PHP的Redis分布式锁,该锁具备自动延长过期时间的功能。当设置的过期时间为默认值0时,系统会自动在业务执行期间每隔一定时间重置过期时间,同时设置了最大续期次数以防止长时间占用锁。通过一个Map存储续期任务信息,加锁成功后启动延迟任务进行续期,确保锁在业务过程中保持有效。
摘要由CSDN通过智能技术生成

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

思路

思路参考了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) {

return new Lock(this).setSuccess(false).setMessage("illegal argument!");

}

Lock lock = acquire(lockKey, lockValue, lockWatchdogTimeout);

if (!lock.isSuccess()) {

return lock;

}

expirationRenewalMap.put(lockKey, new RenewLockInfo(lock));

scheduleExpirationRenewal(lockKey, lockValue, lockWatchdogTimeout, maxRenewTimes, new AtomicInteger());

return lock;

}

定时续期

当前锁还未被释放(Ma

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值