22 redission都提供了哪些类型的分布式锁

vvEcho 2025-03-05 12:16:19
Categories: Tags:

1. 可重入锁(Reentrant Lock)

功能:支持同一线程多次获取同一把锁(重入),避免死锁;支持锁自动过期和手动解锁。

实现:通过Redis的Hash结构记录锁持有者的线程标识和重入次数。若锁存在且线程标识匹配,重入次数递增;解锁时递减,直至次数为0才释放锁。

使用示例:

1
2
RLock lock = redisson.getLock("anyLock");
lock.lock(); // 或 lock.tryLock(3, 10, TimeUnit.SECONDS);

2. 公平锁(Fair Lock)

功能:在多个线程竞争时,按请求顺序分配锁,确保先到先得;同样支持可重入和自动续期。

实现:通过Redis的队列维护请求顺序,线程按队列顺序依次获取锁。

使用示例:

1
2
RLock fairLock = redisson.getFairLock("anyLock");
fairLock.lock(); // 公平加锁

3. 联锁(MultiLock)

功能:将多个独立的锁(可来自不同Redis实例)绑定为一个联锁,要求所有锁同时获取成功才算加锁成功。

适用场景:需跨多个资源或服务强一致加锁的场景。

使用示例:

1
2
3
4
RLock lock1 = redisson1.getLock("lock1");
RLock lock2 = redisson2.getLock("lock2");
RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);
multiLock.lock();

4. 红锁(RedLock)

功能:基于RedLock算法,在多个Redis节点(通常为奇数)上加锁,超过半数成功即视为加锁成功,提升高可用性。

与联锁区别:联锁要求全部成功,红锁仅需多数成功,容错性更高。

使用示例:

1
2
3
4
RLock lock1 = redisson1.getLock("lock1");
RLock lock2 = redisson2.getLock("lock2");
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2);
redLock.lock();

5. 读写锁(ReadWriteLock)

功能:实现读-写分离,允许多个读锁共存,但写锁独占。适用于读多写少场景。

实现:通过Redis的Hash结构区分读锁和写锁,写锁存在时禁止其他锁获取。

使用示例:

1
2
3
RReadWriteLock rwLock = redisson.getReadWriteLock("anyRWLock");
rwLock.readLock().lock(); // 读锁
rwLock.writeLock().lock(); // 写锁

6. 信号量(Semaphore)

功能:控制并发线程数,限制同时访问资源的线程数量。

实现:通过Redis的计数器实现,获取信号量时计数器减1,释放时加1。

使用示例:

1
2
RSemaphore semaphore = redisson.getSemaphore("semaphore");
semaphore.acquire(); // 获取信号量

7. 闭锁(CountDownLatch)

功能:等待多个线程完成操作后再继续执行,类似Java的CountDownLatch。

实现:通过Redis的计数器递减,计数为0时唤醒等待线程。

使用示例:

1
2
3
RCountDownLatch latch = redisson.getCountDownLatch("latch");
latch.trySetCount(5); // 初始化计数
latch.await(); // 等待计数归零