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

简单的分布式锁 SpringBoot Redisson‌

基于SpringBoot和Redisson的分布式锁在实际开发中有多个经典应用场景,以下是几个典型的案例实现:

库存扣减防超卖

在电商秒杀场景中,使用Redisson的可重入锁保证库存扣减的原子性,有效防止超卖问题11。实现关键在于获取商品锁后执行库存检查与扣减:

@Autowired 
private RedissonClient redissonClient;public boolean reduceStock(Long productId, Integer quantity) {String lockKey = "product:stock:" + productId;RLock lock = redissonClient.getLock(lockKey);try {// 尝试获取锁,最多等待3秒,锁超时时间为10秒if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {Integer stock = (Integer) redisTemplate.opsForValue().get("product:stock:" + productId);if (stock >= quantity) {redisTemplate.opsForValue().set("product:stock:" + productId, stock - quantity);return true;}}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}return false;
}

分布式任务调度控制

在集群环境下确保定时任务仅由一个节点执行,避免重复处理:

public void executeScheduledTask() {RLock lock = redissonClient.getLock("scheduled:task:report");if (lock.tryLock()) {try {// 生成日报表逻辑generateDailyReport();} finally {lock.unlock();}}
}

接口幂等性保障

对于支付、订单创建等关键接口,通过分布式锁实现幂等控制8:

public String createOrder(OrderRequest request) {String idempotentKey = "order:create:" + request.getOrderNo();RLock lock = redissonClient.getLock(idempotentKey);try {if (lock.tryLock(2, 30, TimeUnit.SECONDS)) {// 检查是否已处理if (orderService.existsByOrderNo(request.getOrderNo())) {return "订单已存在";}// 创建订单业务逻辑return orderService.createOrder(request);}} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "处理失败";
}

热点数据缓存重建

防止缓存击穿,当缓存失效时仅允许一个线程查询数据库并重建缓存11:

public User getUserById(Long userId) {String cacheKey = "user:info:" + userId;User user = (User) redisTemplate.opsForValue().get(cacheKey);if (user == null) {RLock lock = redissonClient.getLock("user:lock:" + userId);try {if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {// 双重检查user = (User) redisTemplate.opsForValue().get(cacheKey);if (user == null) {user = userMapper.selectById(userId);redisTemplate.opsForValue().set(cacheKey, user, 30, TimeUnit.MINUTES);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}}return user;
}

跨服务资源锁定

使用联锁(MultiLock)协调多个服务的资源操作11:

public boolean updateMultiResources(Long orderId, Long productId) {RLock orderLock = redissonClient.getLock("order:lock:" + orderId);RLock inventoryLock = redissonClient.getLock("inventory:lock:" + productId);RLock multiLock = redissonClient.getMultiLock(orderLock, inventoryLock);try {if (multiLock.tryLock(5, 30, TimeUnit.SECONDS)) {// 同时锁定订单和库存资源orderService.update(orderId);inventoryService.update(productId);return true;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (multiLock.isHeldByCurrentThread()) {multiLock.unlock();}}return false;
}

配置与依赖

在pom.xml中添加Redisson依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId> <version>3.23.5</version> 
</dependency> 

application.yml配置:

spring:redis:host: 127.0.0.1port: 6379

 

  • 锁命名‌:使用业务相关的有意义的锁名称11
  • 超时设置‌:锁超时时间应大于业务执行最长时间11
  • 异常处理‌:确保锁最终被释放,避免死锁11
  • 看门狗机制‌:Redisson自动续期避免业务未完成锁过期11
  • 避免嵌套‌:不在锁内调用其他带锁的方法
http://www.dtcms.com/a/540100.html

相关文章:

  • 如何建立一个视频网站网站域名权
  • 如何修改wordpress站名泰安网站建设哪家不错
  • 【Swift】LeetCode 73. 矩阵置零
  • 益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍
  • 蚂蚁集团已在香港申请「ANTCOIN」等 Web3 相关商标
  • HarmonyOS实战项目:开发一个分布式新闻阅读客户端
  • “Web3、区块链、稳定币”名词解析
  • 【参赛心得】鸿蒙三方库适配实战:从 Hadoop 生态到鸿蒙生态,企业级项目集成的 6 个最佳实践
  • 【SpringBoot】29 核心功能 - 数据访问 - Spring Boot 2 操作 Redis 实践指南:本地安装与阿里云 Redis 对比应用
  • B.40.3.1-Spring Boot与Spring Cloud核心技术详解
  • HarmonyOS RemoteWindow远程窗口组件的分布式能力深度解析
  • HarmonyOS自动化测试与持续集成实战指南
  • 智慧团建网站入口官网手机前端开发软件工具
  • 中国建设银行金华分行网站微信小程序在哪里找出来
  • Visual Basic 二进制文件
  • WEB前端技术基础(第四章:JavaScript-网页动态交互语言)
  • 房屋租赁合同中协助办证义务分析及租金退还法律意见
  • 广州住房和城乡建设厅网站网站建设 中企动力公司
  • 外贸网站空间哪个好WordPress首页id
  • STM32F407移植FreeRTOS完整教程(HAL库版本)
  • Flink 并行度与最大并行度从 0 到弹性扩缩容
  • STL list深度解析:从原理到手写实现
  • AI驱动数据分析革新:奥威BI一键生成智能报告
  • day20_权限控制
  • Flutter 状态管理详解:深入理解与使用 Bloc
  • Spring Boot 移除 Undertow 深度解析:技术背景、迁移方案与性能优化实践
  • c# stateless介绍
  • 烽火台网站网站优化要从哪些方面做
  • 建设一个网站需要多少钱网页版游戏在线玩2022
  • 基于Flask的穷游网酒店数据分析系统(源码+论文+部署+安装)