发布网友 发布时间:2022-04-21 19:06
共1个回答
热心网友 时间:2024-09-02 19:37
资深面试官:你们项目中的分布式锁是如何实现的?
老任:我们使用Redis的set命令,这个命令有nx和ex选项。
资深面试官:如果锁到期了,业务还没结束,如何进行自动续期呢?
老任:这个......面试官,您刚才问的是什么问题来着?
资深面试官:你们项目中分布式锁是如何实现的。
老任:我们直接使用了Redisson中提供的分布式锁。
资深面试官:你给我出去!!!
Redisson的看门狗机制
在使用Redis分布式锁时,为了防止异常情况下锁无法正常释放,我们通常会为锁设置一个超时时间。
但这也带来一个问题:如果设置了超时时间,而业务逻辑在规定时间内还没执行完,锁就会被释放,这可能会引起新的问题。
因此,Redisson提供了监控锁的看门狗机制。在锁关闭前,看门狗会不断延长锁的超时时间。默认情况下,看门狗的锁超时时间lockWatchdogTimeout是30秒,这个值是可以设置的。
源码解析
现在让我们进入tryLock()方法,查看一下实现源码。在该方法中调用tryAcquire()方法。
tryAcquire()方法中调用tryAcquireAsync()方法。
tryAcquireAsync()方法中,如果leaseTime小于等于0,调用scheleExpirationRenewal方法进行续期。
从该方法中看到,leaseTime表示锁的超时时间。如果调用tryLock方法加锁时设置了该参数,看门狗机制就不会生效。
scheleExpirationRenewal()方法中调用了renewExpiration()方法。
renewExpiration()方法中启用了一个timeout定时器,internalLockLeaseTime的1/3时间去执行续期操作,续期的方法是renewExpirationAsync()。
renewExpirationAsync的方法内容如下,里面定义了lua脚本,如果key存在,执行pexpire命令进行续期操作。
以上就是Redis分布式锁到期后,业务还没结束时的自动续期解决方案,现在你明白了么?