Spring Boot 中整合 Redisson 实现分布式锁

server/2024/10/17 21:47:38/
  1. 添加 Redisson 依赖:在 pom.xml 文件中添加 Redisson 的依赖。

  2. 配置 Redis 连接信息:在 application.propertiesapplication.yml 文件中配置 Redis 的连接信息。

  3. 使用 Redisson 实现分布式锁:在预减库存的地方使用 Redisson 提供的分布式锁功能,确保在并发情况下只有一个线程能够成功减库存。

下面是一个简单的示例:

首先,添加 Redisson 依赖到 pom.xml 文件中:

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

接下来,配置 Redis 连接信息。在 application.properties 文件中添加以下配置:

# Redisson 配置
spring.redis.host=your_redis_host
spring.redis.port=your_redis_port

然后,在预减库存的地方注入 org.redisson.api.RedissonClient 并使用它来创建分布式锁。例如:

java
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class StockService {@Autowiredprivate RedissonClient redissonClient;public boolean reduceStock(String productId) {// 获取分布式锁RLock lock = redissonClient.getLock("stock_lock_" + productId);try {// 尝试加锁,最多等待10秒,锁定时间30秒boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);if (isLocked) {// 成功获取到锁// 执行减库存操作// 注意要在执行减库存操作之前再次检查库存是否充足,避免因为网络延迟等原因导致的超卖问题int currentStock = getCurrentStock(productId);if (currentStock > 0) {updateStock(productId, currentStock - 1);return true; // 减库存成功} else {return false; // 库存不足,无法减库存}} else {// 未能获取到锁return false; // 减库存失败}} catch (InterruptedException e) {Thread.currentThread().interrupt();return false; // 减库存失败} finally {// 释放锁lock.unlock();}}// 模拟获取当前库存private int getCurrentStock(String productId) {// 实际情况中应该从数据库或缓存中获取库存信息// 这里简单地返回一个固定的库存量return 100;}// 模拟更新库存private void updateStock(String productId, int newStock) {// 实际情况中应该更新数据库或缓存中的库存信息// 这里只是简单地打印日志System.out.println("更新库存,产品ID:" + productId + ",新库存:" + newStock);}
}

在这个示例中,我们使用 Redisson 创建了一个名为 "stock_lock_" + productId 的分布式锁来保护减库存操作。在减库存的过程中,我们首先获取分布式锁,然后再次检查当前库存是否充足,避免因为网络延迟等原因导致的超卖问题。如果库存充足,则执行减库存操作,并释放锁。如果未能获取到锁,则说明有其他线程正在执行减库存操作,此时返回减库存失败。

这样就实现了在 Spring Boot 中使用 Redisson 实现分布式锁进行预减库存的功能。确保在项目中正确配置 Redisson 和 Redis 连接信息,并在关键代码块中使用分布式锁来保护共享资源。


http://www.ppmy.cn/server/9107.html

相关文章

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

server_id 引发的 MySQL 级联复制同步异常

MySQL 级联复制的坑&#xff0c;我帮你们踩了。 作者&#xff1a;蒋士峰&#xff0c;爱可生 DBA 团队成员&#xff0c;熟悉 MySQL&#xff0c;Oracle 等数据库。每天的积累&#xff0c;时间久了&#xff0c;会带来不一样的收货。 爱可生开源社区出品&#xff0c;原创内容未经授…

Android 混淆模板

保持对外门面类 -keep public class com.xx.devtools.middle.manager.DevLogManager { public *; } 保持model类 -keep public class com.xx.devtools.middle.model.** { public *; } -keep public class com.xx.devtools.middle.Globals { public *; } 保持Bus注册方法 -…

【Interconnection Networks 互连网络】Flattened Butterfly 扁平蝶形拓扑

Flattened Butterfly 扁平蝶形拓扑 1. 传统蝶形网络 Butterfly Topology2. 扁平蝶形拓扑 Flattened Butterfly3.On-Chip Flattened Butterfly 扁平蝶形拓扑应用于片上网络 Flattened Butterfly 扁平蝶形拓扑 扁平蝶形拓扑是一种经济高效的拓扑&#xff0c;适用于高基数路由器…

EF6(Entity Framework 6)基础知识

一、Entity Framework 6 概述 Entity Framework (EF) 是 Microsoft 提供的一个对象关系映射器 (ORM)&#xff0c;它使得 .NET 开发人员能够使用 .NET 对象来处理数据库&#xff0c;从而无需经常编写大部分数据访问代码。EF 提供了许多功能&#xff0c;包括更改跟踪、查询构建、…

java spring security oauth2 动态 修改当前登录用户的基础信息以及权限2.0(无需重新登录)

两年前写过一篇动态修改角色和权限当时表述的不是很全面 比如如何修改其他用户权限 修改用户信息没有效果等 再写一篇 如何修改其他用户权限 不管如何改变实际需求就是获取用户token,不管是当前用户还是所有用户 当前用户的token可以通过上下文拿到,而其他用户的token该如何拿…

Flume

目录 Flume概述 Flume架构 Flume案例 入门案例 实时监控单个追加文件 实时监控目录下多个新文件 实时监控目录下的多个追加文件 Flume事务 Flume内部原理 Sorce ->> Channel Channel ->> Sink Flume拓扑结构 复制和多路复用 负载均衡和故障转移 聚合…

高级软考项目管理之项目范围管理

项目范围管理 规划范围管理:为记录如何定义、确认和控制项目范围及产品范围&#xff0c;而创建范围管理计划的过程。 #mermaid-svg-ILyx4A2hFZzF7bry {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ILyx4A2hFZzF7b…