# 电商模拟 **Repository Path**: ning-zhihao6/e-commerce-simulation ## Basic Information - **Project Name**: 电商模拟 - **Description**: 模拟电商开发中会遇到的问题,并用成熟的方案尝试解决 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-09 - **Last Updated**: 2026-04-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 秒杀系统Demo ## 项目简介 这是一个基于SpringBoot、Redis、RocketMQ和MySQL的秒杀系统Demo,实现了高并发场景下的秒杀功能,确保不超卖、不重复下单。 ## 技术栈 - **SpringBoot**:项目框架 - **Redis**:预减库存、防重复抢购、限流 - **RocketMQ**:削峰、异步下单 - **MySQL**:真实扣库存、存订单 - **MyBatis**:数据库操作 ## 核心目标 1. **扛高并发秒杀**:通过Redis和RocketMQ实现高并发处理 2. **绝对不超卖**:Redis原子减库存 + MySQL行锁更新 3. **不重复下单**:Redis Set集合去重 4. **数据库不被打崩**:通过RocketMQ异步解耦,避免直接操作数据库 5. **消息可靠消费**:实现消息幂等性,确保消息不丢失、不重复消费 ## 流程设计 1. **前端请求**:用户点击“立即秒杀” 2. **Redis层**: - 根据商品ID,判断Redis库存是否 > 0 - 判断用户ID是否已经抢购过(set去重) - Redis原子预减库存(decr) - 库存不足 → 直接返回“已抢完” - 校验通过 → 进入下一步 3. **RocketMQ生产者**: - 封装秒杀消息(userId + goodsId + 数量) - 同步发送消息到MQ - 发送成功 → 返回前端“排队中,结果稍后通知” 4. **MQ异步消费**: - 监听秒杀Topic - 幂等校验(防止重复消费) - MySQL真实扣减库存 + 创建订单 - 消费成功 → 结束 - 消费异常 → 进入重试队列 → 死信队列 ## Redis设计 1. **库存控制**: - Key:`seckill:stock:{goodsId}` - Value:库存数量 - 命令:`INCR / DECR` 原子操作 2. **抢购去重**: - Key:`seckill:user:{goodsId}` - Type:Set集合 - 价值:一个用户只能抢一次 3. **接口限流**: - Key:`seckill:limit:userId` - 用`incr` + 过期时间实现频控 ## RocketMQ设计 1. **Topic**:`topic_seckill_order` 2. **生产者组**:`producer_group_seckill` 3. **消费者组**:`consumer_group_seckill` 4. **消费模式**: - 集群消费 - 手动ACK(保证消息不丢) - 开启重试 - 异常进入死信队列 ## 数据库设计 1. **商品表goods**: - id、name、stock、price 2. **订单表order**: - order_id、user_id、goods_id、status、create_time ## 快速开始 1. **启动依赖服务**:Redis、RocketMQ、MySQL 2. **初始化数据库**:执行`src/main/resources/sql/init.sql` 3. **配置修改**:修改`application.properties`中的数据库连接信息 4. **启动应用**:`mvn spring-boot:run` 5. **初始化库存**:`GET http://localhost:8080/initStock/1` 6. **发起秒杀**:`GET http://localhost:8080/seckill/{userId}/{goodsId}` ## 核心代码说明 ### 1. SeckillService.java 实现秒杀业务逻辑,包括Redis预减库存、防重复抢购、RocketMQ异步下单 ### 2. SeckillConsumer.java 监听RocketMQ中的秒杀消息,处理订单创建逻辑,实现消息幂等性 ### 3. SeckillController.java 处理秒杀相关的HTTP请求 ## 注意事项 1. **Redis配置**:确保Redis服务正常运行,配置正确 2. **RocketMQ配置**:确保RocketMQ服务正常运行,配置正确 3. **数据库配置**:确保MySQL服务正常运行,配置正确 4. **消息幂等性**:通过Redis实现消息幂等性,避免重复消费 5. **异常处理**:实现异常重试机制,确保消息可靠消费 ## 项目结构 ``` src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── qcby/ │ │ └── demorocketmq/ │ │ ├── DemoRocketmqApplication.java │ │ ├── controller/ │ │ ├── service/ │ │ ├── consumer/ │ │ ├── mapper/ │ │ ├── entity/ │ │ └── config/ │ └── resources/ │ ├── mapper/ │ ├── sql/ │ └── application.properties └── test/ ``` ## License MIT License