Redisson的RedLock与联锁(MultiLock)的区别

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();
}