# shop_chunk_redis **Repository Path**: learning_source_code/shop_chunk_redis ## Basic Information - **Project Name**: shop_chunk_redis - **Description**: 基于redis+mysql的强一致性解决秒杀场景的方案 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-02-09 - **Last Updated**: 2026-02-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 电商库存高并发扣减系统 基于Redis分桶 + MySQL的强一致性库存管理方案,支持高并发秒杀场景。 ## 📋 项目简介 本系统采用"明细驱动 + 合并提交"的核心架构,通过Redis分桶技术实现高并发场景下的库存扣减,确保不超卖、不少卖,并保持数据强一致性。 ### 核心特性 - ✅ **Redis分桶技术**:哈希取模分散并发压力 - ✅ **明细驱动架构**:所有库存流转先插明细,再批量更新 - ✅ **50ms合并提交**:高性能批量更新机制 - ✅ **防超卖三层防护**:Redis验证 + 数据库条件 + 单品限购 - ✅ **自动降级策略**:Redis不可用时自动降级到数据库 - ✅ **幂等性保证**:通过唯一索引天然实现 - ✅ **乐观锁机制**:防止并发更新冲突 ## 🏗️ 技术栈 ### 后端 - Spring Boot 3.2.0 - MyBatis-Plus 3.5.5 - MySQL 8.0+ - Redis 7.0+ - Redisson 3.25.2(分布式锁) ### 前端 - Vue 3.4+ (Composition API) - TypeScript 5.3+ - Element Plus 2.5+ - Vue Router 4.2+ - Pinia 2.1+ (状态管理) - Axios 1.6+ (HTTP客户端) - Vite 5.0+ (构建工具) ## 📦 项目结构 ``` . ├── database/ # 数据库脚本 │ ├── schema.sql # 建表脚本 │ └── mock-data.sql # 测试数据 ├── shop-inventory-backend/ # 后端项目 │ ├── src/main/java/ │ │ └── com/shop/inventory/ │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # Mapper接口 │ │ ├── service/ # 业务服务 │ │ ├── controller/ # 控制器 │ │ ├── config/ # 配置类 │ │ ├── enums/ # 枚举类 │ │ └── common/ # 通用类 │ └── src/main/resources/ │ └── application.yml # 配置文件 └── shop-inventory-frontend/ # 前端项目 ├── src/ │ ├── api/ # API接口封装 │ ├── router/ # 路由配置 │ ├── stores/ # Pinia状态管理 │ ├── types/ # TypeScript类型定义 │ ├── views/ # 页面组件 │ ├── App.vue # 根组件 │ └── main.ts # 应用入口 ├── index.html ├── package.json └── vite.config.ts ``` ## 🚀 快速开始 ### 1. 数据库初始化 ```bash # 方式1:使用mysql命令行 mysql -h 175.178.0.51 -P 3306 -u shop_chunk_redis -p36GeG26j7EHWpFJR shop_chunk_redis < database/schema.sql mysql -h 175.178.0.51 -P 3306 -u shop_chunk_redis -p36GeG26j7EHWpFJR shop_chunk_redis < database/mock-data.sql # 方式2:使用MySQL客户端工具 # 连接信息: # Host: 175.178.0.51 # Port: 3306 # Username: shop_chunk_redis # Password: 36GeG26j7EHWpFJR # Database: shop_chunk_redis ``` ### 2. 启动后端服务 ```bash cd shop-inventory-backend mvn clean install mvn spring-boot:run ``` 服务启动后访问:http://localhost:8080/api ### 3. 测试API ```bash # 查询商品列表 curl http://localhost:8080/api/products # 查询商品详情 curl http://localhost:8080/api/products/1001 # 库存预热(管理员接口) curl -X POST http://localhost:8080/api/admin/inventory/1/preheat # 创建订单 curl -X POST http://localhost:8080/api/orders \ -H "Content-Type: application/json" \ -d '{ "userId": 1, "items": [{ "productId": 1001, "specId": 2001, "quantity": 2, "price": 8999.00 }] }' ``` ### 4. 启动前端项目 ```bash cd shop-inventory-frontend npm install npm run dev ``` 前端服务启动后访问:http://localhost:3000 #### 前端功能页面 - **商品列表** (`/products`) - 浏览商品,查看库存状态 - **商品详情** (`/products/:id`) - 查看详情,立即购买 - **订单列表** (`/orders`) - 查看所有订单 - **订单详情** (`/orders/:orderNo`) - 支付/取消订单,倒计时 - **库存管理** (`/admin/inventory`) - 预热库存,查看明细 - **监控面板** (`/admin/monitor`) - 实时监控,异常告警 ## 📊 数据库设计 ### 核心表结构 1. **inventory** - 库存主表 - sq: 可售库存(前端展示) - lq: 系统预锁库存(高并发缓冲区) - wq: 预扣库存(下单未付款) - oq: 占用库存(付款后占用) 2. **inventory_deduct_detail** - 库存扣减明细表 - 记录所有库存流转的唯一凭证 - 支持8种流转类型(SQ→LQ, LQ→WQ, WQ→OQ等) 3. **inventory_redis_bucket** - Redis分桶配置表 - 持久化分桶配置 - 支持动态调整分桶数量 4. **orders** - 订单表 5. **order_item** - 订单明细表 6. **product** - 商品表 7. **product_spec** - 商品规格表 8. **warehouse** - 仓库表 ## 🔄 核心流程 ### 1. 库存预热(SQ→LQ) ``` 管理员触发预热 → 转移50%库存到LQ → 初始化Redis分桶 → 插入分桶配置 ``` ### 2. 用户下单(LQ→WQ) ``` 用户提交订单 → 哈希取模选择分桶 → Redis DECRBY扣减 → 插入扣减明细 → 返回成功 ``` ### 3. 订单支付(WQ→OQ) ``` 用户支付 → 验证订单状态 → 插入付款明细 → 更新原明细状态 → 更新订单状态 ``` ### 4. 合并提交(批量更新) ``` 定时任务触发 → 锁定Redis分桶 → 查询待处理明细 → 批量更新库存表 → 重新初始化分桶 ``` ## 🔧 配置说明 ### 数据库配置 ```yaml spring: datasource: url: jdbc:mysql://175.178.0.51:3306/shop_chunk_redis username: shop_chunk_redis password: 36GeG26j7EHWpFJR ``` ### Redis配置 ```yaml spring: data: redis: host: 175.178.0.51 port: 6379 password: zouyuaredis ``` ### 业务配置 ```yaml inventory: preheat-ratio: 0.5 # 预热比例50% bucket-count: 10 # 分桶数量 order-timeout-minutes: 15 # 订单超时时间 merge-threshold: 100 # 合并提交阈值 merge-interval: 50 # 合并提交间隔(ms) ``` ## 📝 API文档 ### 库存管理 - `POST /admin/inventory/{invId}/preheat` - 库存预热 - `GET /admin/inventory/{invId}` - 查询库存详情 - `GET /admin/inventory/{invId}/details` - 查询扣减明细 ### 订单管理 - `POST /orders` - 创建订单 - `POST /orders/{orderNo}/pay` - 支付订单 - `POST /orders/{orderNo}/cancel` - 取消订单 - `GET /orders` - 订单列表 ### 商品管理 - `GET /products` - 商品列表 - `GET /products/{id}` - 商品详情 ## 🎯 性能指标 - 支持 **10000 QPS** 并发下单 - 订单响应时间 **< 200ms** (P95) - 合并提交耗时 **< 50ms** - 库存查询 **100000 QPS** (带缓存) ## 🛡️ 防超卖机制 1. **Redis分桶验证**:DECRBY返回值≥0才允许扣减 2. **数据库条件**:UPDATE时加WHERE条件验证库存充足 3. **单品限购**:前端+后端双重验证购买数量 4. **乐观锁**:使用version字段防止并发冲突 ## 📖 开发文档 详细的开发文档请查看: - [需求文档](.kiro/specs/shop-inventory-system/requirements.md) - [设计文档](.kiro/specs/shop-inventory-system/design.md) - [任务列表](.kiro/specs/shop-inventory-system/tasks.md) ## 🤝 贡献指南 欢迎提交Issue和Pull Request! ## 📄 许可证 MIT License