当前位置: 首页 > news >正文

Redisson分布式锁实战指南:原理、用法与项目案例

今天在项目练习中用到了Redisson分布式锁,这里介绍一下Redisson分布式锁的使用以及在项目中的使用案例。

一、为什么需要分布式锁?

在分布式系统中,多个服务实例可能同时操作共享资源(如库存扣减、订单处理)。传统的单机锁无法跨JVM工作,此时需分布式锁保证:

  1. 互斥性:同一时刻仅一个客户端持有锁
  2. 防死锁:持有锁的客户端崩溃时自动释放
  3. 可重入:同一线程可多次获取同一把锁
  4. 高性能:高并发下仍能快速响应

Redisson优势:基于Redis实现,支持可重入锁、锁续期、看门狗机制,API简洁且生产级可靠。

二、SpringBoot整合Redisson
1. 添加Maven依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.2</version>
</dependency>
2. 配置Redis连接(application.yml)
spring:redis:host: 127.0.0.1port: 6379password: yourpassword
3. 注入RedissonClient
@Autowired
private RedissonClient redisson;

三、核心API及使用规范
RLock lock = redisson.getLock("orderLock"); // 锁名称需全局唯一// 推荐写法:设置锁超时时间(秒) + 自动续期 + 可重入
lock.lock(30, TimeUnit.SECONDS); try {// 业务代码(受保护的临界区)
} finally {lock.unlock(); // 必须放在finally块中确保释放
}

关键参数说明

  • lock():阻塞式获取锁(默认30秒超时)
  • tryLock(时间, 单位):非阻塞尝试获取锁
  • 锁续期:后台线程每10秒检查持有锁的客户端,自动续期至超时时间
四、项目案例:高并发库存扣减
场景描述

电商系统中,1000个用户同时抢购100件商品,需保证:

  • 库存不超卖
  • 扣减操作原子性
实现代码
@Service
public class InventoryService {@Autowiredprivate RedissonClient redisson;@Autowiredprivate RedisTemplate<String, Integer> redisTemplate;public boolean deductStock(String productId, int quantity) {String lockKey = "lock:product:" + productId;RLock lock = redisson.getLock(lockKey);try {// 尝试获取锁(等待5秒,锁持有30秒后自动失效)if (lock.tryLock(5, 30, TimeUnit.SECONDS)) {// 1. 检查当前库存Integer stock = redisTemplate.opsForValue().get("stock:" + productId);if (stock == null || stock < quantity) {return false; // 库存不足}// 2. 扣减库存(原子操作)redisTemplate.opsForValue().decrement("stock:" + productId, quantity);// 3. 记录订单日志(模拟DB操作)log.info("库存扣减成功:商品ID={}, 数量={}", productId, quantity);return true;}} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("获取锁中断异常", e);} finally {if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock(); // 仅释放当前线程持有的锁}}return false;}
}

执行流程
  1. 线程A获取lock:product:1001
  2. 检查Redis库存 → 扣减 → 写日志
  3. 线程B尝试获取锁(最多等待5秒)
  4. 线程A执行完毕释放锁,线程B进入临界区
五、高级特性与避坑指南
1. 锁续期(看门狗)(Watchdog)
  • 默认每10秒检查锁持有状态,若业务未完成则续期至30秒
  • 注意:避免锁超时时间设置过短导致业务未完成锁已释放
2. 可重入锁验证
// 同一线程可多次获取锁(计数+1)
lock.lock();
lock.lock();  // 成功获取
lock.unlock(); // 计数-1
lock.unlock(); // 计数归零,实际释放

3. 避免死锁的实践
  • 超时释放:显式设置锁超时(即使未手动解锁)
  • 非阻塞尝试:用tryLock()替代lock()避免线程永久阻塞
  • 禁止嵌套异常:解锁代码禁止抛出异常(确保finally执行)
六、常见问题解答

Q:Redisson锁与Redis的SETNX有什么区别?

A:SETNX需自行实现续期、重入等机制,Redisson提供完整的分布式锁解决方案。

Q:锁超时时间如何设置?

A:应根据业务最长耗时设置(如平均耗时200ms,可设超时1s),建议添加熔断降级。

Q:主从切换时是否安全?

A:Redisson提供红锁(RedLock) 算法(需至少3个独立Redis主节点),但多数场景单节点已足够。

七、总结

Redisson通过简单的API解决了分布式锁的核心问题:

  1. 可重入锁 → 避免线程自我阻塞
  2. Watchdog机制 → 防止业务未完成锁提前释放
  3. 多种锁类型 → 支持公平锁、联锁(MultiLock)、红锁等

最佳实践:锁粒度要细(如按商品ID加锁)、超时时间合理、解锁逻辑必须可靠!

http://www.xdnf.cn/news/1301131.html

相关文章:

  • GPT 解码策略全解析:从 Beam Search 到 Top-p 采样
  • 流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)
  • CPU、内存、存储:生信分析任务的服务器配置精要
  • 第20章 LINQ 笔记
  • 8.15网络编程——UDP和TCP并发服务器
  • 【数据分享】上市公司创新韧性数据(2007-2023)
  • 数据驱动测试提升自动化效率
  • 终极手撸cpu系列-详解底层原理-CPU硬核解剖:从0和1到 看透CPU逻辑设计内部原理,弄清楚现代多线程cpu工作原理
  • Microsoft Visual Studio常用快捷键和Windows系统常用快捷键的整理
  • Linux-地址空间
  • 开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
  • 【学习笔记】NTP服务客户端配置
  • Go语言中安全停止Goroutine的三种方法及设计哲学
  • 前瞻性技术驱动,枫清科技助力制造企业借助大模型完成生产力转化
  • zabbix部署问题后常见问题
  • 新手入门Makefile:FPGA项目实战教程(二)
  • 【CV 目标检测】②R-CNN模型
  • 【Redis】分布式系统的演化过程
  • MyBatis的基本用法和配置方式
  • Highcharts Dashboards | 打造企业级数据仪表板:从图表到数据驾驶舱
  • 全球电商业财一体化:让出海品牌实现“看得见的增长“
  • demo 通讯录 + 城市选择器 (字母索引左右联动 ListItemGroup+AlphabetIndexer)笔记
  • Nginx反向代理与缓存实现
  • 人工智能与社会治理:从工具到生态的范式重构
  • Kafka生产者——提高生产者吞吐量
  • 切换VSCODE 中的默认 shell
  • GitHub 上 Star 数量前 18 的开源 AI Agent 项目
  • 制造装配、仓储搬运、快递装卸皆适配!MinkTec 弯曲形变传感器助力,让人体工学改变劳动生活
  • Vue3从入门到精通: 4.5 数据持久化与同步策略深度解析
  • Elasticsearch 深分页问题