Redisson 提供了多种分布式锁实现,每种锁适用于不同的场景。以下是常见的锁类型及其适用场景的总结:


可重入锁(Reentrant Lock)

  • 特点
    • 支持同一线程多次加锁(可重入)。
    • 默认是非公平锁,但支持公平锁模式。
    • 通过 lock()unlock() 手动管理锁的获取与释放。
  • 适用场景
    • 需要保证分布式环境下的代码块互斥执行(如订单处理、库存扣减)。
    • 需要递归调用或嵌套加锁的场景。
  • 示例
    RLock lock = redisson.getLock("myLock");
    lock.lock();
    try {
        // 业务逻辑
    } finally {
        lock.unlock();
    }
    

可过期锁(Lock with Lease Time)

  • 特点
    • 锁自动释放,避免死锁(需设置租约时间)。
  • 适用场景
    • 需要防止锁被长时间占用的场景(如定时任务)。
  • 示例
    RLock lock = redisson.getLock("expirableLock");
    lock.lock(10, TimeUnit.SECONDS); // 10秒后自动释放
    

2. 公平锁(Fair Lock)

  • 特点
    • 按请求顺序分配锁,避免线程饥饿。
    • 性能略低于非公平锁(需要维护请求队列)。
  • 适用场景
    • 需要公平分配锁资源的场景(如排队系统、按顺序处理任务)。
  • 示例
    RLock fairLock = redisson.getFairLock("fairLock");
    fairLock.lock();
    

读写锁(ReadWriteLock)

  • 特点
    • 分为读锁(共享锁)和写锁(排他锁)。
    • 读锁允许多个线程同时获取,写锁独占。
  • 适用场景
    • 读多写少的场景(如缓存数据更新)。
  • 示例
    RReadWriteLock rwLock = redisson.getReadWriteLock("rwLock");
    RLock readLock = rwLock.readLock();
    RLock writeLock = rwLock.writeLock();
    

信号量(Semaphore)

  • 特点
    • 控制同时访问资源的线程数量。
    • 支持限流和资源池管理。
  • 适用场景
    • 限制并发访问数(如数据库连接池)。
  • 示例
    RSemaphore semaphore = redisson.getSemaphore("semaphore");
    semaphore.acquire(); // 获取许可
    semaphore.release(); // 释放许可
    

闭锁(CountDownLatch)

  • 特点
    • 等待多个线程完成任务后再继续执行。
  • 适用场景
    • 分布式任务协调(如批量处理完成后的汇总)。
  • 示例
    RCountDownLatch latch = redisson.getCountDownLatch("latch");
    latch.trySetCount(3); // 初始化计数器
    latch.await(); // 等待计数器归零
    latch.countDown(); // 减少计数器
    

3. 联锁(MultiLock)

  • 特点
    • 将多个 RLock 对象关联为一个锁,需同时获取所有锁。
    • 任一锁获取失败会导致整体失败。
  • 适用场景
    • 需要同时锁定多个资源的原子操作(如跨服务事务)。
  • 示例
    RLock lock1 = redisson.getLock("lock1");
    RLock lock2 = redisson.getLock("lock2");
    RLock multiLock = redisson.getMultiLock(lock1, lock2);
    multiLock.lock();
    

4. 红锁(RedLock)

  • 特点
    • 基于 Redis 的分布式锁算法(RedLock),需多个独立的 Redis 节点。
    • 通过多数节点成功加锁来确保高可用性。
  • 适用场景
    • 对锁的强一致性要求极高的场景(如金融交易)。
  • 示例
    RLock lock1 = redisson.getLock("lock1");
    RLock lock2 = redisson.getLock("lock2");
    RLock lock3 = redisson.getLock("lock3");
    RLock redLock = redisson.getRedLock(lock1, lock2, lock3);
    redLock.lock();
    


锁的选型建议

锁类型 适用场景 关键优势
可重入锁 通用互斥操作(如订单处理) 简单易用,支持可重入
公平锁 按顺序分配锁(如排队系统) 公平性保证
联锁/红锁 多资源强一致性操作(如分布式事务) 跨节点原子性
读写锁 读多写少(如缓存更新) 提升读并发性能
信号量 限流或资源池管理(如连接池) 精准控制并发量
可过期锁 防止死锁(如超时任务) 自动释放,安全性高
闭锁 分布式任务协调(如批量处理) 多线程协同

注意事项

  1. 避免长时间持锁:锁的持有时间应尽量短,防止阻塞其他线程。
  2. 设置合理超时时间:使用 tryLock() 设置超时,避免无限等待。
  3. 异常处理:确保在 finally 块中释放锁,防止死锁。
  4. 红锁成本:红锁需要多个独立 Redis 节点,部署和维护成本较高。

合理选择锁类型,结合业务场景设计分布式同步机制,可以在保证一致性的同时提升系统性能。