Redisson 是一个在 Java 中实现的 Redis 客户端,它提供了许多分布式对象和服务,如分布式锁、分布式集合、分布式映射等。Redisson 的锁机制是其核心功能之一,它使用了 Redis 的数据结构来实现分布式锁,并提供了看门狗机制来保证锁的安全性。
Redisson 锁流程
-
加锁:
- 客户端向 Redis 发送加锁请求。
- Redisson 使用 Redis 的
SETNX
命令尝试在 Redis 中设置一个锁键,如果设置成功(返回 1),则客户端获得锁。 - 如果设置失败(返回 0),说明锁已经被其他客户端持有,当前客户端需要等待。
-
锁续期(看门狗机制):
- Redisson 引入了看门狗机制来自动延长锁的持有时间,防止锁因为超时而被自动释放。
- 当客户端加锁成功后,会启动一个定时任务(看门狗),定期向 Redis 发送命令来更新锁的过期时间。
- 客户端持有锁期间,只要定期向 Redis 发送命令,锁就不会因为超时而被释放。
-
解锁:
- 当客户端完成业务逻辑后,会向 Redis 发送解锁请求。
- Redisson 使用 Redis 的
DEL
命令删除锁键,释放锁。 - 如果有其他客户端在等待该锁,它们将有机会获得锁。
看门狗机制
- 看门狗机制的主要作用是自动延长锁的持有时间,确保锁不会因为超时而被释放。
- 当客户端持有锁时,它会启动一个定时任务(看门狗),定期向 Redis 发送命令来更新锁的过期时间。
- 如果客户端崩溃或网络中断导致无法续期,锁会在达到其过期时间后被自动释放,其他客户端可以获取该锁。
线程ID Lua脚本
- Redisson 使用 Lua 脚本来实现锁的加锁和解锁过程,以确保操作的原子性。
- 在加锁时,Redisson 会使用 Lua 脚本在 Redis 中设置锁键,并将当前线程的 ID 作为锁的值。
- 解锁时,Redisson 同样使用 Lua 脚本来检查锁的值(即线程 ID)是否与当前尝试解锁的线程 ID 匹配,以确保只有获得锁的线程才能解锁。