功能
卖家部分:
- 卖家登录
- 商品管理
买家部分:
- 买家登录
- 商品列表页面
- 商品详情页面
- 秒杀
卖家登录
不做(本项目专注实现秒杀)
卖家商品管理
不做(本项目专注实现秒杀)
商品的增删改查,通过操作数据库来实现
买家登录
根据用户名、密码进行登录
密码加密
原因:
http发送数据是明文的,为了密码安全,要进行 md5 加密
保存在数据库中的密码,也是经过加密的,防止黑客攻击,密码泄露,如:csdn 密码泄露
session共享(高级)
使用 spring session + redis 共享 session
商品列表页面
查询商品表
商品详情页面
买家查看,显示秒杀信息
显示秒杀信息
未开始,显示:
距离开始还剩:00:05:00,分以下情况:- 少于1分钟,显示:
距离开始还剩:00:00:20 - 少于1小时,显示:
距离开始还剩:00:03:20 - 少于1天,显示:
距离开始还剩:07:03:20 - 显示原价、秒杀价格
- 少于1分钟,显示:
已经开始,显示:
距离结束:00:05:00,分以下情况:- 少于1分钟,显示:
距离结束:00:00:20 - 少于1小时,显示:
距离结束:00:03:20 - 少于1天,显示:
距离结束:07:03:20 - 显示秒杀价格
- 少于1分钟,显示:
已经结束,显示原价
秒杀
校验:是否秒杀进行中
- 正在进行中,是秒杀价格
- 未开始、已经结束,是原价格
校验:是否有库存
高并发带来的问题:情人节这天,恰好 同一时刻,10个女神 同时 给你发微信,问:晚上7:00有空吗?你确实有空,所以回复:有空
如果10个女神,一个接着一个给你发微信,即:不是同一时刻,那么,你只会答应一个女神,拒绝其他人
——-库存也会出现这种问题——-
如果是单线程,没有问题,如下:
高并发,会出现下面问题:
解决:
将商品信息保存到 redis 中,通过 decr 命令将库存 减一,该操作具有 原子性,总能安全地进行操作。
校验:不允许重复购买
从 redis 查询 用户id:商品id:订单id ,如果存在,说明已经购买,提示不能重复购买
redis 效率高,MySQL 效率低,防止黄牛、黑客通过软件重复购买,发出大量请求,将 MySQL搞崩溃
处理业务
将用户信息、商品信息,保存到订单表
将
用户id:商品id:订单id保存到 redis 数据库中
优化
静态资源缓存
html、css、js、图片 很少改动,浏览器每次访问页面时,不需要向服务器发请求,使用缓存即可
配置:
- 在 nginx 中配置
- 在 springboot 中配置
redis 数据缓存
商品数据
首页频繁访问,每次从MySQL数据库中查询商品数据,从磁盘读取数据,性能差,也给MySQL带来过大压力
所以将这部分数据缓存到 redis 数据库中,查询商品过程如下:
- 先从 redis 查询,如果有就直接返回响应
- 如果 redis 中没有该数据,就从 MySQL 中查询,然后放入到 redis 中
读写一致性
- 修改商品信息后,要删除 redis 中的缓存数据
- 读取MySQL 的 binlog 日志,对 redis 进行更新操作
防止重复购买
将 用户id、商品id、订单id 保存到 redis数据库中,防止重复购买
秒杀校验时,只需要查询 redis 数据库,不需要查询 MySQL
redis 问题
架构
压力测试
jmeter
表设计
用户表
表名:t_user
| 字段 | 类型 | 长度 | 允许null | 说明 |
|---|---|---|---|---|
| id | bigint | 否 | 主键,自增1 | |
| nickname | varchar | 128 | 否 | 昵称 |
| password | varchar | 255 | 否 | 密码 |
| create_time | datetime | 否 | 注册时间 |
商品表
表名:t_goods
| 字段 | 类型 | 长度 | 允许null | 说明 |
|---|---|---|---|---|
| id | bigint | 否 | 主键,自增1 | |
| name | varchar | 128 | 否 | 商品名称 |
| detail | text | 否 | 商品详情 | |
| price | decimal(10,2) | 32 | 否 | 商品价格 |
| stock | int | 否 | 库存,默认是0 | |
| create_time | datetime | 否 | 创建时间 |
秒杀商品表
表名:t_seckill_goods
| 字段 | 类型 | 长度 | 允许null | 说明 |
|---|---|---|---|---|
| id | bigint | 否 | 主键,自增1 | |
| goods_id | bigint | 否 | 商品表主键 | |
| price | decimal(10,2) | 32 | 否 | 秒杀价格 |
| start_time | datetime | 否 | 秒杀开始时间 | |
| end_time | datetime | 否 | 秒杀结束创建时间 | |
| create_time | datetime | 否 | 创建时间 |
订单表
表名:t_order
| 字段 | 类型 | 长度 | 允许null | 说明 |
|---|---|---|---|---|
| id | bigint | 否 | 主键,自增1 | |
| user_id | bigint | 否 | 用户id | |
| goods_id | bigint | 否 | 商品id | |
| address | varchar | 255 | 否 | 收货地址 |
| goods_name | varchar | 128 | 否 | 商品名称 |
| goods_price | decimal(10,2) | 32 | 否 | 商品价格 |
| goods_count | int | 否 | 商品数量,默认值0 | |
| create_time | datetime | 否 | 创建时间 |
注意:商品名称、商品价格必须存在,这样,商品下架、删除后,仍能查到



