电商秒杀系统

功能

卖家部分:

  • 卖家登录
  • 商品管理

买家部分:

  • 买家登录
  • 商品列表页面
  • 商品详情页面
  • 秒杀

卖家登录

不做(本项目专注实现秒杀)

卖家商品管理

不做(本项目专注实现秒杀)
商品的增删改查,通过操作数据库来实现

买家登录

根据用户名、密码进行登录

密码加密

原因:

  • http发送数据是明文的,为了密码安全,要进行 md5 加密

  • 保存在数据库中的密码,也是经过加密的,防止黑客攻击,密码泄露,如:csdn 密码泄露

session共享(高级)

使用 spring session + redis 共享 session

商品列表页面

查询商品表

商品详情页面

买家查看,显示秒杀信息

显示秒杀信息

  • 未开始,显示:距离开始还剩:00:05:00,分以下情况:

    • 少于1分钟,显示:距离开始还剩:00:00:20
    • 少于1小时,显示:距离开始还剩:00:03:20
    • 少于1天,显示:距离开始还剩:07:03:20
    • 显示原价、秒杀价格
  • 已经开始,显示:距离结束:00:05:00,分以下情况:

    • 少于1分钟,显示:距离结束:00:00:20
    • 少于1小时,显示:距离结束:00:03:20
    • 少于1天,显示:距离结束:07:03:20
    • 显示秒杀价格
  • 已经结束,显示原价

秒杀

校验:是否秒杀进行中

  • 正在进行中,是秒杀价格
  • 未开始、已经结束,是原价格

校验:是否有库存

高并发带来的问题:情人节这天,恰好 同一时刻,10个女神 同时 给你发微信,问:晚上7:00有空吗?你确实有空,所以回复:有空

如果10个女神,一个接着一个给你发微信,即:不是同一时刻,那么,你只会答应一个女神,拒绝其他人

——-库存也会出现这种问题——-

如果是单线程,没有问题,如下:

高并发,会出现下面问题:

解决:
将商品信息保存到 redis 中,通过 decr 命令将库存 减一,该操作具有 原子性,总能安全地进行操作。

校验:不允许重复购买

从 redis 查询 用户id:商品id:订单id ,如果存在,说明已经购买,提示不能重复购买

redis 效率高,MySQL 效率低,防止黄牛、黑客通过软件重复购买,发出大量请求,将 MySQL搞崩溃

处理业务

  1. 将用户信息、商品信息,保存到订单表

  2. 将 用户id:商品id:订单id 保存到 redis 数据库中

优化

静态资源缓存

html、css、js、图片 很少改动,浏览器每次访问页面时,不需要向服务器发请求,使用缓存即可

配置:

  • 在 nginx 中配置
  • 在 springboot 中配置

redis 数据缓存

商品数据

首页频繁访问,每次从MySQL数据库中查询商品数据,从磁盘读取数据,性能差,也给MySQL带来过大压力

所以将这部分数据缓存到 redis 数据库中,查询商品过程如下:

  1. 先从 redis 查询,如果有就直接返回响应
  2. 如果 redis 中没有该数据,就从 MySQL 中查询,然后放入到 redis 中

读写一致性

  • 修改商品信息后,要删除 redis 中的缓存数据
  • 读取MySQL 的 binlog 日志,对 redis 进行更新操作

防止重复购买

将 用户id、商品id、订单id 保存到 redis数据库中,防止重复购买

秒杀校验时,只需要查询 redis 数据库,不需要查询 MySQL

redis 问题

redis的雪崩、穿透和击穿

架构

redis介绍

消息队列

RabbitMQ教程目录

压力测试

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 否 创建时间

注意:商品名称、商品价格必须存在,这样,商品下架、删除后,仍能查到