一、前言:为什么 Redisson 是 Redis 分布式锁的"最佳拍档"?
你是否曾为以下问题头疼:
- 手写 Lua 脚本太繁琐?
- 锁过期了但业务还没执行完?
- 想实现可重入、公平锁、读写锁却无从下手?
- 多个资源需要同时加锁(如订单 + 库存)?
Redisson ------ 这个基于 Redis 的 Java 客户端框架 ,不仅封装了分布式锁的所有复杂细节,还提供了企业级的高可用、高性能、高扩展性支持。
本文将带你全面了解 Redisson 的核心功能,尤其是其分布式锁体系,助你轻松应对高并发场景。
二、Redisson 是什么?
Redisson 是一个基于 Netty 实现的 高性能 Redis Java 客户端 ,它不仅提供对 Redis 数据结构的操作,更内置了分布式对象、服务、锁、同步器等高级功能。
GitHub 地址:https://github.com/redisson/redisson
Star 数:⭐ 23k+(截至 2025 年)
核心优势:
- ✅ 原生支持 Redis 单机、哨兵、Cluster、云托管
- ✅ 提供 JDK 并发包(java.util.concurrent)的分布式实现
- ✅ 自动续期(Watchdog) 防止业务超时导致锁失效
- ✅ 支持 可重入、公平、联锁、红锁、读写锁 等多种锁模型
三、快速入门:Spring Boot 集成 Redisson
1. 添加依赖(Maven)
XML
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.24.1</version> <!-- 使用最新稳定版 -->
</dependency>
2. 配置 Redis 连接(application.yml)
spring:
redis:
host: localhost
port: 6379
# 若使用 Cluster,配置 cluster.nodes
💡
redisson-spring-boot-starter会自动配置RedissonClientBean
四、Redisson 分布式锁核心功能详解
1️⃣ 可重入锁(Reentrant Lock)------ 最常用!
java
@Autowired
private RedissonClient redissonClient;
public void processOrder(Long orderId) {
RLock lock = redissonClient.getLock("order:lock:" + orderId);
try {
// 加锁(默认30秒过期,自动续期)
lock.lock();
// 业务逻辑:创建订单、扣库存...
createOrder(orderId);
} finally {
// 解锁(线程安全)
lock.unlock();
}
}
🔑 核心特性:
- 可重入 :同一线程可多次
lock(),计数器递增 - 自动续期(Watchdog):默认每 10 秒续一次(30 秒 TTL → 永不超时,直到 unlock)
- value = UUID + ThreadId,防止误删
✅ 无需手动设置 TTL,Redisson 全自动管理!
2️⃣ 公平锁(Fair Lock)------ 按请求顺序获取
java
RLock fairLock = redissonClient.getFairLock("fair:queue:lock");
fairLock.lock(); // 先到先得,避免"饥饿"
📌 适用场景:任务调度、排队系统等需要严格 FIFO 的业务
3️⃣ 读写锁(ReadWriteLock)------ 读多写少优化
java
RReadWriteLock rwLock = redissonClient.getReadWriteLock("product:stock:lock");
// 读操作(允许多个并发读)
RLock readLock = rwLock.readLock();
readLock.lock();
try {
// 查询库存
} finally {
readLock.unlock();
}
// 写操作(独占)
RLock writeLock = rwLock.writeLock();
writeLock.lock();
try {
// 扣减库存
} finally {
writeLock.unlock();
}
💡 提升读密集型场景的吞吐量
4️⃣ 联锁(MultiLock)------ 同时锁定多个资源
java
RLock lock1 = redissonClient.getLock("order:lock");
RLock lock2 = redissonClient.getLock("inventory:lock");
RLock multiLock = redissonClient.getMultiLock(lock1, lock2);
multiLock.lock(); // 必须同时获得所有锁
try {
// 创建订单 + 扣库存(原子性)
} finally {
multiLock.unlock();
}
⚠️ 注意:避免死锁!建议按固定顺序加锁(如字典序)
5️⃣ 红锁(RedLock)------ 高可用方案(谨慎使用)
java
RLock lock1 = client1.getLock("myLock");
RLock lock2 = client2.getLock("myLock");
RLock lock3 = client3.getLock("myLock");
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
boolean isLocked = redLock.tryLock(100, 10000, TimeUnit.MILLISECONDS);
📌 说明 :向多个独立 Redis 节点加锁,需多数成功。
⚠️ 争议较大,多数场景单 Redis Cluster 已足够
五、高级特性:锁的等待、超时与中断
1. 带超时的加锁(避免无限等待)
java
// 最多等待 3 秒,获得锁后持有 10 秒
if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {
try {
// 业务
} finally {
lock.unlock();
}
} else {
throw new BusinessException("系统繁忙,请稍后再试");
}
2. 响应中断(Interruptible)
java
lock.lockInterruptibly(); // 可被 Thread.interrupt() 中断
六、Redisson 分布式锁 vs 手写实现对比
| 功能 | 手写 Redis 锁 | Redisson |
|---|---|---|
| 原子加锁 | 需写 Lua | ✅ 内置 |
| 自动续期 | 需自己实现看门狗 | ✅ 默认开启 |
| 可重入 | 需设计计数器 | ✅ 原生支持 |
| 公平锁 | 难以实现 | ✅ 一行代码 |
| 读写锁 | 几乎不可能 | ✅ 完整支持 |
| 联锁/红锁 | 极复杂 | ✅ 封装完善 |
| 异常安全 | 易出错 | ✅ 经过生产验证 |
💡 结论 :除非有特殊限制,否则优先使用 Redisson!
七、避坑指南:常见使用误区
❌ 误区 1:忘记 unlock() 导致内存泄漏
正解 :必须放在
finally块中
❌ 误区 2:在异步线程中使用锁(ThreadId 不匹配)
风险 :子线程无法重入,甚至无法解锁
正解 :锁应在同一逻辑线程中加/解
❌ 误区 3:过度使用 RedLock
建议 :99% 的场景,单 Redis Cluster + Redisson 可重入锁足够安全
八、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!