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