基于 SpringBoot + Redis (Lettuce) + RabbitMQ 实现「Redis 预扣库存 + 异步同步数据库」

基于 SpringBoot + Redis (Lettuce) + RabbitMQ 实现「Redis 预扣库存 + 异步同步数据库」 一、整体流程回顾前端下单请求进来,先查 Redis 库存执行DECR原子扣减:结果 0 → 库存不足,直接返回失败结果 ≥ 0 → 扣减成功,发送消息到 MQMQ 消费者消费消息,异步更新数据库库存配套:消息重试、定时对账、DB 乐观锁防重复扣减二、核心依赖(pom.xml 关键)!-- Spring Data Redis -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- RabbitMQ -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-amqp/artifactId /dependency !-- MyBatis/MyBatis-Plus 操作DB -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency三、常量 MQ 队列配置1. 常量类public class StockConstant { // Redis 库存 key 前缀 public static final String REDIS_STOCK_PREFIX = "product:stock:"; // MQ 队列名称 public static final String STOCK_SYNC_QUEUE = "stock.sync.queue"; }2. RabbitMQ 配置(队列、交换机、绑定)import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitConfig { @Bean public Queue stockSyncQueue() { // 持久化队列,宕机不丢失消息 return new Queue(StockConstant.STOCK_SYNC_QUEUE, true); } }四、库存实体 Mapper(DB 层)1. 商品库存实体(带乐观锁)import com.baomidou.mybatisplus.annotation.Version; import lombok.Data; @Data public class ProductStock { private Long id; // 商品ID private Long productId; // 数据库真实库存 private Integer stock; // 乐观锁版本号,防止异步重复扣减 @Version private Integer version; }2. Map