8.6 KiB
8.6 KiB
秒杀系统详细设计文档
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)
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)
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)
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)
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 部署步骤
- 配置Redis集群
- 初始化MySQL数据库
- 部署Spring Boot应用
- 配置负载均衡
10. 测试计划
10.1 功能测试
- 用户注册登录
- 商品浏览
- 购物车操作
- 秒杀功能
- 订单管理
10.2 性能测试
- 并发用户测试
- 秒杀压力测试
- 系统稳定性测试
10.3 压力测试指标
- QPS: 目标10000+
- 响应时间: <100ms
- 成功率: >99.9%