# flash-sale **Repository Path**: libingquan/flash-sale ## Basic Information - **Project Name**: flash-sale - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-09 - **Last Updated**: 2026-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flash Sale — 秒杀系统 > 高并发秒杀系统,Java Web 学习路线项目二(简历核心项目)。 --- ## 项目定位 这是 Java Web 转行学习路线中的第二个项目,目标是在 4 周内(第 9-12 周)完成一个**有业务逻辑、非单纯 CRUD** 的高并发秒杀系统。这个项目是拿到面试的核心——简历上要强调解决了什么技术问题、用了什么方案、达到了什么效果。 ## 核心功能 | 模块 | 功能 | 技术点 | |------|------|--------| | 商品 | 商品列表、详情、缓存预热 | Redis 预热、`@Cacheable` | | 秒杀 | 秒杀资格判断、下单扣库存 | Redis 原子操作防超卖 | | 订单 | 订单异步创建、削峰填谷 | RabbitMQ 延迟队列 | | 防重复 | 防重复下单、防重复秒杀 | Redisson 分布式锁 | | 限流 | 接口限流、熔断降级 | Sentinel / 令牌桶 | | 压测 | JMeter 压测 + 优化前后对比 | 聚合报告、QPS 对比 | ## 技术栈 | 技术 | 版本 | 用途 | |------|------|------| | Java | 17+ | 主力语言 | | Spring Boot | 3.x | 应用框架 | | MyBatis-Plus | 3.5+ | ORM | | MySQL | 8.0+ | 数据持久化 | | Redis | 7.x | 预减库存、分布式锁、缓存预热 | | Redisson | 3.x | 分布式锁(防重复下单) | | RabbitMQ | 3.x | 异步下单、削峰填谷 | | Sentinel | 1.8+ | 接口限流、熔断降级 | | JMeter | 5.x | 压力测试 | | Docker | — | 本地运行中间件 | | Maven | 3.9+ | 构建工具 | ## 项目结构 ``` flash-sale/ ├── sql/ │ └── schema.sql # 数据库初始化脚本 ├── src/main/java/com/flashsale/ │ ├── FlashSaleApplication.java │ ├── config/ │ │ ├── RedisConfig.java # Redis 序列化配置 │ │ ├── RabbitMQConfig.java # 队列、交换机、绑定声明 │ │ └── RedissonConfig.java # Redisson 客户端配置 │ ├── common/ │ │ ├── Result.java # 统一返回格式 │ │ ├── ResultCode.java # 状态码枚举 │ │ └── GlobalExceptionHandler.java │ ├── controller/ │ │ ├── GoodsController.java # 商品浏览 │ │ ├── FlashSaleController.java # 秒杀入口 │ │ └── OrderController.java # 订单查询 │ ├── service/ │ │ ├── GoodsService.java # 商品 + 缓存预热 │ │ ├── FlashSaleService.java # 秒杀核心逻辑(Redis 扣库存) │ │ ├── OrderService.java # 订单服务 │ │ └── MQConsumer.java # RabbitMQ 消费者(异步下单) │ ├── mapper/ │ │ ├── GoodsMapper.java │ │ └── OrderMapper.java │ ├── entity/ │ │ ├── Goods.java │ │ ├── FlashSaleGoods.java │ │ └── FlashSaleOrder.java │ └── util/ │ ├── LuaScriptUtil.java # Lua 脚本加载 │ └── RedisKeyUtil.java # Redis Key 命名规范 ├── src/main/resources/ │ ├── application.yml │ └── lua/ │ └── decr_stock.lua # Redis 原子扣库存脚本 ├── docs/ │ ├── architecture.md # 架构设计 │ ├── api-design.md # 接口设计 │ └── load-test-plan.md # JMeter 压测方案 └── pom.xml ``` ## 环境配置 ### 开发环境要求 | 工具 | 最低版本 | 说明 | |------|----------|------| | JDK | 17+ | `java -version` | | Maven | 3.9+ | `mvn -version` | | Docker | 20.10+ | `docker --version` | | Docker Compose | v2+ | `docker compose version` | ### 一键环境检测 ```bash bash scripts/env-check.sh ``` 该脚本会检查: - Java、Maven、Docker 是否安装且版本符合要求 - 端口 3306/6379/5672/15672 是否空闲 - 容器 mysql-flash/redis-flash/rabbitmq-flash 是否已在运行 ### 启动中间件(MySQL + Redis + RabbitMQ) ```bash bash scripts/env-start.sh ``` 脚本自动完成: 1. 通过 `docker-compose.yml` 启动三个容器 2. 等待健康检查通过(MySQL/Redis/RabbitMQ 就绪) 3. 自动执行 `sql/schema.sql` 初始化数据库 4. 验证各服务连接 ### 停止中间件 ```bash bash scripts/env-stop.sh # 停止容器,保留数据 bash scripts/env-stop.sh --clean # 停止容器 + 删除数据卷(清空所有数据) ``` ### 启动应用 ```bash # 编辑数据库连接信息(如使用默认配置可跳过) cp src/main/resources/application.example.yml src/main/resources/application.yml vim src/main/resources/application.yml # 启动 Spring Boot 应用 mvn spring-boot:run ``` --- ## 面试话术模板 > "这个秒杀项目我的核心工作是解决三个问题——**防超卖、削峰、防重复下单**。 > > 防超卖用 Redis 的 DECR 原子操作 + Lua 脚本保证扣库存的原子性; > 削峰是用户请求先经过 Redis 扣库存成功后才发 MQ 消息,后端慢慢消费创建订单,不会瞬间压垮数据库; > 防重复下单是在消费 MQ 时用 Redisson 分布式锁,同一个用户同一个商品只能创建一个订单。 > > 最后用 JMeter 压测验证了效果:**优化前 200 QPS 就开始超卖,优化后 2000 QPS 无超卖、无重复订单。**" --- ## 阶段二验收标准 - [ ] 秒杀核心流程跑通:Redis 预减库存 + MQ 异步下单 - [ ] 1000 并发压测无超卖 - [ ] Sentinel 限流生效 + Redisson 防重复下单 - [ ] 压测报告产出(优化前后 QPS 对比) - [ ] 代码已推送到 GitHub(公开仓库) - [ ] 能讲清楚:为什么用 Redis 而不是直接操作数据库、如何削峰、如何防超卖 ## 设计文档 - [数据库设计](sql/schema.sql) - [架构设计](docs/architecture.md) - [接口设计](docs/api-design.md) - [压测方案](docs/load-test-plan.md) ## 来源 本项目设计来自 [Java Web 转行学习路线](../../projects/learning-java-web/学习路线.md) 第二阶段项目二。