帮忙么网 > JAVA > 当前页面

从算法 + 数据结构 + 规则,解释一下Redisson分布式锁

2026-06-06 NEW个对象

很多开发者使用 Redisson 时,只知道调用 lock() 和 unlock(),却不清楚其内部原理。 实际上,可以从 算法(Algorithm)数据结构(Data Structure)规则(Rule) 三个维度来理解 Redisson 分布式锁。

📌 一、数据结构:Redis 中存储了什么?

Redisson 的锁本质上是 Redis 中的一个 Key。

lock:order:123

当线程获得锁后,Redis 会记录:

  • 持有锁的线程标识(UUID + ThreadId)
  • 重入次数(Reentrant Count)
  • 锁的过期时间(TTL)

例如:

key:lock:order:123
field:UUID:threadId
value:3

这里的 value=3 表示当前线程已经重入了 3 次。

🎯 二、算法:Redisson 如何完成加锁?
1、CAS 抢锁算法

Redisson 使用 Lua 脚本完成加锁操作。

如果锁不存在
  创建锁
  设置 TTL
  返回成功

如果锁存在
  判断是否当前线程

  是 → 重入次数 +1
  否 → 返回失败

由于 Redis 单线程执行 Lua,因此整个过程具有原子性。

2、Pub/Sub 唤醒机制

很多人以为 Redisson 获取不到锁时会一直 while(true) 轮询 Redis。

实际上并不是。

获取失败后,线程会订阅一个 Channel:

redisson_lock__channel

锁释放时发布消息,等待线程被唤醒后重新竞争锁。

✅ 优点:减少 Redis 压力。
✅ 优点:降低 CPU 消耗。

3、WatchDog 看门狗算法

如果执行:

lock.lock();

默认锁过期时间为 30 秒。

为了避免业务执行超过 30 秒导致锁失效,Redisson 会启动 WatchDog。

每隔 10 秒
自动续期一次

本质上是一种心跳续约机制。

📌 三、规则:Redisson 遵循哪些约束?
1、互斥规则

同一时刻只能有一个线程持有锁。

✅ 保证共享资源安全。
❌ 不允许多个线程同时修改同一数据。

2、可重入规则

同一个线程可以重复获取同一把锁。

lock();
lock();
lock();

unlock();
unlock();
unlock();

只有重入次数减到 0 时,锁才真正释放。

3、超时释放规则

每把锁都有 TTL。

即使应用崩溃:

❌ 没有执行 unlock()。
✅ Redis 到期后仍会自动释放锁。

4、Owner 校验规则

只有锁的持有者才能解锁。

线程 A 获取锁后,线程 B 无法直接解锁,否则会导致数据一致性问题。
🎯 四、整体流程
线程请求锁

Lua 抢锁

获取成功

执行业务

WatchDog 自动续期

unlock()

发布解锁消息

唤醒等待线程
📌 总结

Redisson 分布式锁本质上是:

使用 Redis 保存锁状态,使用 Lua 保证原子性,使用 Pub/Sub 实现等待与唤醒,使用 WatchDog 保证锁不会意外过期。

一句话总结:

Redisson 分布式锁 = Redis + Lua + Pub/Sub + WatchDog + 可重入规则。

上一篇:数据库出现死锁的案例

下一篇:

相关文章

推荐文章