Redisson提供了两种分布式锁机制:RedLock(红锁)和MultiLock(联锁),它们在实现分布式锁时有重要区别。
1. RedLock (红锁)
设计原理:
- 基于Redis官方提出的Redlock算法实现
- 目的是在Redis集群环境下提供更可靠的分布式锁
- 需要至少3个独立的Redis主节点(非集群模式)
工作流程: - 客户端获取当前时间
- 依次尝试从多个独立的Redis实例获取锁
- 计算获取锁花费的总时间
只有在大多数节点(N/2+1)上获取锁成功,并且总耗时小于锁的有效时间,才认为获取成功
特点:
更高的安全性,防止单点故障
性能开销较大(需要与多个节点通信)
适用于对一致性要求极高的场景
2. MultiLock (联锁)
设计原理:
- Redisson自有的多锁机制
- 将多个RLock对象关联为一个联锁
- 所有关联的锁都成功获取才算成功
工作流程:
- 将多个RLock对象组合成一个MultiLock
- 尝试按顺序获取所有锁
- 任何一个锁获取失败都会导致整体失败并释放已获取的锁
特点:
实现相对简单
性能比RedLock好
不要求Redis节点独立
适用于需要同时锁定多个资源的场景
选择建议
如果您的系统对分布式锁的可靠性要求极高,且有多个独立的Redis主节点,选择RedLock
如果您只需要在Redis集群环境下锁定多个相关资源,选择MultiLock
在大多数业务场景中,MultiLock已经足够使用
代码示例
RedLock使用:
RLock lock1 = redisson1.getLock("lock1");
RLock lock2 = redisson2.getLock("lock2");
RLock lock3 = redisson3.getLock("lock3");
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
redLock.lock();
try {
// 业务逻辑
} finally {
redLock.unlock();
}
MultiLock使用:
RLock lock1 = redisson.getLock("lock1");
RLock lock2 = redisson.getLock("lock2");
RLock lock3 = redisson.getLock("lock3");
RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);
multiLock.lock();
try {
// 业务逻辑
} finally {
multiLock.unlock();
}