Redisson有几种锁?使用场景是什么?
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();
锁的选型建议
| 锁类型 | 适用场景 | 关键优势 |
|---|---|---|
| 可重入锁 | 通用互斥操作(如订单处理) | 简单易用,支持可重入 |
| 公平锁 | 按顺序分配锁(如排队系统) | 公平性保证 |
| 联锁/红锁 | 多资源强一致性操作(如分布式事务) | 跨节点原子性 |
| 读写锁 | 读多写少(如缓存更新) | 提升读并发性能 |
| 信号量 | 限流或资源池管理(如连接池) | 精准控制并发量 |
| 可过期锁 | 防止死锁(如超时任务) | 自动释放,安全性高 |
| 闭锁 | 分布式任务协调(如批量处理) | 多线程协同 |
注意事项
- 避免长时间持锁:锁的持有时间应尽量短,防止阻塞其他线程。
- 设置合理超时时间:使用
tryLock()设置超时,避免无限等待。 - 异常处理:确保在
finally块中释放锁,防止死锁。 - 红锁成本:红锁需要多个独立 Redis 节点,部署和维护成本较高。
合理选择锁类型,结合业务场景设计分布式同步机制,可以在保证一致性的同时提升系统性能。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果