👌看门狗机制的原理是什么?

👌看门狗机制的原理是什么?

口语化答案

在我们平常使用分布式锁的时候,一般会设置一个锁的过期时间,那么如果锁过期的时候,业务还没执行完怎么办,于是就有了看门狗。看门狗机制是一种用于自动续约分布式锁的机制,确保在持有锁的客户端处理完业务逻辑之前,锁不会过期。当客户端获取到锁时,会在 Redis 中设置一个键和一个过期时间(默认30秒)。同时,Redisson 会启动一个后台任务,这个任务会定期检查锁的状态。看门狗任务会每隔一段时间,默认是锁的过期时间的1/3,即10秒,检查锁的状态。如果锁仍然被持有,看门狗任务会将锁的过期时间重置为初始值。这样,锁的过期时间不断被延长,直到客户端明确释放锁或者客户端挂掉。以上。

题目解析

看门狗机制非常常问,一旦问到分布式锁的问题,就会产生这个问题,当你说出异常情况下,传统的分布式锁,采取过期时间释放,防止死锁的时候,就会引入到这个问题。

面试得分点

后台任务续约,高可靠,自动管理

题目详细答案

Redisson 的看门狗机制是一种用于自动续约分布式锁的机制,确保在持有锁的客户端处理完业务逻辑之前,锁不会过期。比如,我们平时使用分布式锁的时候,一般会设置一个锁的过期时间,那么如果锁过期的时候,业务还没执行完怎么办,于是就有了看门狗。

看门狗机制的原理

初始锁定

当客户端获取到锁时,会在 Redis 中设置一个键(代表锁)和一个过期时间(默认30秒)。同时,Redisson 会启动一个后台任务(看门狗),这个任务会定期检查锁的状态。

自动续约

看门狗任务会每隔一段时间(默认是锁的过期时间的1/3,即10秒)检查锁的状态。如果锁仍然被持有(即客户端还在持有锁且没有释放),看门狗任务会将锁的过期时间重置为初始值(例如,再次设置为30秒)。这样,锁的过期时间不断被延长,直到客户端明确释放锁或者客户端挂掉。

释放锁

当客户端完成业务逻辑后,会显式地调用unlock()方法释放锁。一旦锁被释放,看门狗任务会停止续约,锁在 Redis 中的键会被删除或自然过期。

看门狗机制的工作流程

获取锁:客户端请求获取锁,Redis 中创建一个键表示锁,并设置一个过期时间(例如30秒)。启动看门狗任务,定期检查锁的状态。

定期续约:看门狗任务每隔一定时间(例如10秒)检查锁的状态。如果锁仍然被持有(即客户端还在处理业务逻辑),看门狗任务会重置锁的过期时间(例如,再次设置为30秒)。

锁的释放:客户端业务逻辑完成后,调用unlock()方法释放锁。看门狗任务停止续约,锁在 Redis 中的键被删除或自然过期。

看门狗机制的优势

高可靠性:通过自动续约机制,确保锁在持有者处理完业务逻辑之前不会过期,避免了锁意外过期导致的并发问题。

自动管理:无需手动续约锁的过期时间,简化了分布式锁的使用和管理。

容错性:如果客户端在持有锁期间崩溃或断开连接,锁会在过期时间后自动释放,避免了死锁问题。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

import java.util.concurrent.TimeUnit;

public class RedissonLockExample {
public static void main(String[] args) {
RedissonClient redissonClient = RedissonConfig.createClient();
RLock lock = redissonClient.getLock("myLock");

try {
// 尝试获取锁,等待时间为100秒,锁的过期时间为10秒
if (lock.tryLock(100, 10, TimeUnit.SECONDS)) {
try {
// 业务逻辑
System.out.println("Lock acquired, executing business logic");

// 模拟长时间运行的任务
Thread.sleep(20000);

} finally {
lock.unlock();
System.out.println("Lock released");
}
} else {
System.out.println("Could not acquire lock");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
redissonClient.shutdown();
}
}
}
 wechat
天生我才必有用