Redisson的multilock原理

Redisson 的 RedissonMultiLock(联合锁)是用来同时持有多把独立锁,从而兼顾多资源一致性的"打包锁"。它的工作原理可以分成"加锁""释放""故障处理"三个阶段。


1. 使用场景

  • 多个资源都要锁住才能安全操作,比如"修改两个账户余额""同时持有库存锁和订单锁"。
  • 多节点部署时,需要同时在不同 Redis 节点/不同分片上加锁,避免某个节点挂掉导致锁失效。

2. 核心机制

  1. 加锁流程
java 复制代码
RLock lock1 = redisson.getLock("lock:a");
RLock lock2 = redisson.getLock("lock:b");
RLock lock3 = redisson.getLock("lock:c");

RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);
multiLock.lock();
  • MultiLock 会按顺序依次调用每个子锁的 tryLock()。
  • 只有所有子锁都成功获取,MultiLock 才算加锁成功。
  • 如果中途某把锁获取失败,已经成功的锁会全部释放,保证"不成功就全退"。
  • 支持 lock()(阻塞等待)和 tryLock(wait, lease, unit)(可设置等待时间)。
  1. 释放流程
  • 调 multiLock.unlock() 时,会挨个释放所有子锁。
  • 即便其中一个释放失败(比如 Redis 节点掉线),其他锁仍会尝试释放,避免死锁。

3. WatchDog 与重试

  • MultiLock 的 WatchDog 是逐个子锁触发的:如果 leaseTime = -1,每个子锁都会开启自己的自动续期,独立维护 TTL。
  • 锁重试(等待队列)也是逐个子锁处理:MultiLock 内部对每个锁调用 tryLock,如果设置了 waitTime,会综合判断是否继续尝试。

4. 故障处理(防止脑裂)

  • 如果某个 Redis 节点崩溃,RedissonMultiLock 仍依赖剩余节点的锁来判断是否持有。
  • 常见做法是:MultiLock 包含多个 Redis 实例上的锁(多数据源),只有多数节点持有成功才算加锁成功,这样即使单个 Redis 挂了,锁仍然有效。

5. 与 RedLock 的区别

  • RedissonMultiLock:把多把普通 RLock 组合在一起,全部成功才算成功。常用于锁多个不同资源。
  • RedissonRedLock(实现了 Redis 官方 RedLock 算法):面向多 Redis 节点的"多活锁",要求多数节点加锁成功才算成功,用于跨 Redis 实例防故障。

可以简单理解为:

  • MultiLock = "锁 A 和锁 B 必须一起拿到"。
  • RedLock = "同一把锁在多个 Redis 节点同时加锁,防止节点故障"。

6. 使用建议

  1. MultiLock 的子锁越多,加锁时间越长,失败概率越大,所以只在必须要同时锁多个资源时使用。
  1. 子锁之间不要出现交叉依赖,最好按照固定顺序创建,避免死锁。
  1. 如果只是多 Redis 节点容灾,优先使用 RedissonRedLock;如果是多资源一致性,使用 MultiLock。

总之,RedissonMultiLock 像是"捆绑销售"的锁:把多个普通锁打包,只有全部成功才算真的上锁,从而保证多个资源之间的操作要么一起成功、要么一起失败。

相关推荐
oqX0Cazj25 分钟前
2026超火Go-Zero实战:从架构原理到高并发接口落地,彻底解决接口超时、雪崩问题
开发语言·架构·golang
学会去珍惜9 分钟前
C语言简介
c语言·开发语言
思麟呀12 分钟前
C++11 核心特性(三):强类型枚举、static_assert 与 std::tuple
开发语言·c++
kong@react17 分钟前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
hoiii18718 分钟前
Qt 实现屏幕截图功能
开发语言·qt·命令模式
未若君雅裁23 分钟前
JVM 运行时数据区:程序计数器、堆、虚拟机栈与栈帧
java·jvm
小白学大数据37 分钟前
爬虫性能天花板:asyncio赋能 Aiohttp,并发提速 10 倍
开发语言·爬虫·数据分析
凡人叶枫1 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
凡人叶枫1 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
摇滚侠1 小时前
JavaSE 和 JavaEE 是什么意思
java·java-ee