Files
FlashSaleSystem/docs/设计文档.md

347 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 社区生鲜团购系统详细设计文档
## 1. 项目概述
### 1.1 项目背景
基于Spring Boot + Redis + MySQL构建的社区生鲜团购系统重点展示Redis在分布式场景下的应用。
### 1.2 技术栈
- **后端框架**: Spring Boot 2.7.6
- **缓存**: Redis Cluster集群
- **数据库**: MySQL
- **前端**: JSP
- **开发语言**: Java 1.8
### 1.3 核心特性
- Redis五种数据类型的综合应用
- 分布式锁防止超卖
- 库存预热和原子扣减
- 接口限流控制
- 购物车Hash存储
- Pub/Sub消息队列
- Lua脚本原子操作
- 管道技术性能优化
## 2. 系统架构设计
### 2.1 整体架构
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端JSP页面 │ │ Spring Boot │ │ Redis Cluster │
│ │ │ 应用服务器 │ │ │
│ - 商品展示 │◄──►│ │◄──►│ - 缓存层 │
│ - 秒杀页面 │ │ - Controller │ │ - 分布式锁 │
│ - 购物车 │ │ - Service │ │ - 消息队列 │
│ - 订单管理 │ │ - Repository │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
┌─────────────────┐
│ MySQL │
│ │
│ - 用户数据 │
│ - 商品数据 │
│ - 订单数据 │
└─────────────────┘
```
### 2.2 Redis集群拓扑图
```
Redis Cluster (42.192.62.91)
┌─────────────────────────────────────────────────────────────┐
│ Master Nodes │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ :7000 │ │ :7001 │ │ :7002 │ │
│ │ Slot │ │ Slot │ │ Slot │ │
│ │ 0-5460 │ │5461-10922│ │10923-16383│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ :7003 │ │ :7004 │ │ :7005 │ │
│ │ Replica │ │ Replica │ │ Replica │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ Slave Nodes │
└─────────────────────────────────────────────────────────────┘
```
## 3. 数据库设计
### 3.1 用户表 (users)
```sql
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100),
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
### 3.2 商品表 (products)
```sql
CREATE TABLE products (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
image_url VARCHAR(500),
status TINYINT DEFAULT 1 COMMENT '1:上架 0:下架',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
### 3.3 秒杀活动表 (flash_sales)
```sql
CREATE TABLE flash_sales (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
flash_price DECIMAL(10,2) NOT NULL,
flash_stock INT NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
status TINYINT DEFAULT 1 COMMENT '1:未开始 2:进行中 3:已结束',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
### 3.4 订单表 (orders)
```sql
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
total_price DECIMAL(10,2) NOT NULL,
status TINYINT DEFAULT 1 COMMENT '1:待支付 2:已支付 3:已发货 4:已完成 5:已取消',
order_type TINYINT DEFAULT 1 COMMENT '1:普通订单 2:秒杀订单',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
## 4. Redis数据结构设计
### 4.1 String类型应用
```
# 分布式锁
flash_sale_lock:{product_id} = "locked"
# 接口限流
rate_limit:{user_id}:{api} = count
# 用户token
user_token:{token} = user_id
```
### 4.2 Hash类型应用
```
# 用户信息缓存
user:{user_id} = {
"username": "张三",
"email": "zhangsan@example.com",
"phone": "13800138000"
}
# 商品信息缓存
product:{product_id} = {
"name": "iPhone 15",
"price": "5999.00",
"stock": "100",
"status": "1"
}
# 购物车
user:{user_id}:cart = {
"product_1": "2",
"product_2": "1"
}
```
### 4.3 List类型应用
```
# 订单队列
order_queue = [order_id1, order_id2, order_id3]
# 用户操作日志
user:{user_id}:logs = [log1, log2, log3]
```
### 4.4 Set类型应用
```
# 秒杀成功用户集合
flash_sale:{product_id}:success_users = {user_id1, user_id2}
# 在线用户集合
online_users = {user_id1, user_id2, user_id3}
```
### 4.5 ZSet类型应用
```
# 商品销量排行榜
product_sales_rank = {
product_id1: sales_count1,
product_id2: sales_count2
}
# 用户积分排行榜
user_score_rank = {
user_id1: score1,
user_id2: score2
}
```
## 5. 核心功能设计
### 5.1 秒杀流程设计
```
用户请求秒杀
接口限流检查 (INCR + EXPIRE)
获取分布式锁 (SETNX)
检查库存 (GET)
原子扣减库存 (DECR)
创建订单
释放锁 (DEL)
发送消息通知 (PUBLISH)
```
### 5.2 购物车设计
```
添加商品到购物车
HSET user:{user_id}:cart {product_id} {quantity}
设置过期时间 (EXPIRE)
异步同步到MySQL
```
## 6. 关键技术实现
### 6.1 分布式锁实现
使用SETNX + EXPIRE实现分布式锁防止秒杀超卖问题。
### 6.2 库存预热
活动开始前将商品库存加载到Redis使用DECR进行原子扣减。
### 6.3 接口限流
使用INCR + EXPIRE组合实现滑动窗口限流。
### 6.4 Lua脚本
编写Lua脚本保证秒杀操作的原子性。
### 6.5 消息队列
使用Redis Pub/Sub实现订单状态变更通知。
### 6.6 管道技术
批量操作使用Pipeline提高性能。
## 7. 性能优化策略
### 7.1 缓存策略
- 热点数据预加载
- 多级缓存架构
- 缓存穿透防护
### 7.2 并发控制
- 分布式锁
- 乐观锁
- 队列削峰
### 7.3 数据库优化
- 读写分离
- 分库分表
- 索引优化
## 8. 监控和运维
### 8.1 监控指标
- Redis集群状态
- 接口响应时间
- 系统并发量
- 错误率统计
### 8.2 日志记录
- 操作日志
- 错误日志
- 性能日志
## 9. 部署架构
### 9.1 环境要求
- JDK 1.8+
- Redis Cluster
- MySQL 5.7+
- Tomcat 9.0+
### 9.2 部署步骤
1. 配置Redis集群
2. 初始化MySQL数据库
3. 部署Spring Boot应用
4. 配置负载均衡
## 10. 测试计划
### 10.1 功能测试
- 用户注册登录
- 商品浏览
- 购物车操作
- 秒杀功能
- 订单管理
### 10.2 性能测试
- 并发用户测试
- 秒杀压力测试
- 系统稳定性测试
### 10.3 压力测试指标
- QPS: 目标10000+
- 响应时间: <100ms
- 成功率: >99.9%