Files
FlashSaleSystem/docs/设计文档.md
2025-07-09 17:56:02 +08:00

8.6 KiB
Raw Blame History

秒杀系统详细设计文档

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 部署步骤

  1. 配置Redis集群
  2. 初始化MySQL数据库
  3. 部署Spring Boot应用
  4. 配置负载均衡

10. 测试计划

10.1 功能测试

  • 用户注册登录
  • 商品浏览
  • 购物车操作
  • 秒杀功能
  • 订单管理

10.2 性能测试

  • 并发用户测试
  • 秒杀压力测试
  • 系统稳定性测试

10.3 压力测试指标

  • QPS: 目标10000+
  • 响应时间: <100ms
  • 成功率: >99.9%