Redisson 分布式锁的核心优势
| 特性 | 说明 |
|---|---|
| 可重入 | 同一线程可多次获取同一把锁 |
| 自动续期(Watchdog) | 锁快到期时自动延长,防止业务未完成就被释放 |
| 防死锁 | 设置自动过期时间 |
| 高可用 | 支持 Redis 集群、哨兵、主从 |
| 公平锁 / 非公平锁 | getFairLock() 支持排队 |
| 联锁(MultiLock) | 跨多个 Redis 节点加锁 |
锁类型(按需选择)
// 可重入锁
RLock lock = redissonClient.getLock("myLock");
// 公平锁(按申请顺序获取锁)
RLock fairLock = redissonClient.getFairLock("myFairLock");
// 读写锁
RReadWriteLock rwLock = redissonClient.getReadWriteLock("myRWLock");
RLock readLock = rwLock.readLock();
RLock writeLock = rwLock.writeLock();
// 信号量(限流)
RSemaphore semaphore = redissonClient.getSemaphore("mySemaphore");
semaphore.acquire(); // 获取一个许可
semaphore.release(); // 释放
// 闭锁(CountDownLatch)
RCountDownLatch latch = redissonClient.getCountDownLatch("myLatch");
latch.await(); // 等待
latch.countDown(); // 减 1
最佳实践建议
- 锁粒度要小:不要锁整个方法,只锁关键代码段
- 设置合理的超时时间:避免长时间占用
- 使用 tryLock 非阻塞方式:提升用户体验
- 锁 key 设计合理 :如
"lock:order:create:" + userId - 避免死锁:finally 中确保 unlock
- 监控锁状态:可用于排查问题
总结
| 需求 | 推荐方案 |
|---|---|
| 分布式环境下互斥访问 | ✅ Redisson + Redis |
| 简单场景 | 自定义 Redis SETNX + Lua(不推荐手动实现) |
| 高可靠 | ZooKeeper(CP 模型) |
| 易用性 + 功能丰富 | Redisson 是首选 |