分布式锁-redission功能介绍

一、前言:为什么 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 会自动配置 RedissonClient Bean


四、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 可重入锁足够安全


八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
only-qi4 小时前
微服务场景下,如何实现分布式事务来保证一致性?
分布式·微服务·架构
m0_564876846 小时前
Distributed data parallel (DDP)分布式训练
分布式
BYSJMG7 小时前
计算机毕设选题推荐:基于Hadoop的交通事故数据可视化分析系统
大数据·vue.js·hadoop·分布式·后端·信息可视化·课程设计
野犬寒鸦7 小时前
从零起步学习并发编程 || 第三章:JMM(Java内存模型)详解及对比剖析
java·服务器·开发语言·分布式·后端·学习·spring
虫小宝9 小时前
查券返利机器人的异步任务调度:Java XXL-Job+Redis实现海量查券请求的分布式任务分发
java·redis·分布式
yq19820430115610 小时前
构建高可用资源导航平台:基于Django+Scrapy的分布式架构实践
分布式·scrapy·django
你这个代码我看不懂10 小时前
Kafka常见问题解答
分布式·kafka
Tony Bai11 小时前
Git 即数据库:Beads (bd) —— 专为 AI Agent 打造的分布式任务追踪引擎
数据库·人工智能·分布式·git
小邓睡不饱耶11 小时前
Spark Streaming实时微博热文分析系统:架构设计与深度实现
大数据·分布式·spark