347 lines
8.6 KiB
Markdown
347 lines
8.6 KiB
Markdown
# 社区生鲜团购系统详细设计文档
|
||
|
||
## 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%
|