Redis分布式锁的原理是什么?如何续期?

发布网友 发布时间: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分布式锁到期后,业务还没结束时的自动续期解决方案,现在你明白了么?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com