/SecKill

一个简单的秒杀系统,从最基本功能版本到秒杀接口优化版本到安全方面优化版本

Primary LanguageTSQLMIT LicenseMIT

SecKill

一个简单的秒杀系统,从最基本功能版本到秒杀接口优化版本到安全方面优化版本

1.基本秒杀功能版本

基于SpringBoot+MyBatis搭建开发环境,数据库使用Mysql InnoDB,集成Redis与FastJson,集成RabbitMQ

数据库表结构设计如下:

  • miaoshaUser表:用户信息
  • goods表:所有商品信息
  • miaoshaGoods表:秒杀商品信息
  • miaoshaOrder表:秒杀订单表
  • orderInfo表:订单表

页面设计与流程如下:

  • login.html 用户登陆页

    这里会利用Redis做一个分布式Session来缓存用户基本信息

  • goods_list.html 商品列表页

    查数据库,展示出所有秒杀商品,点击详情进入可进入商品详情页

  • goods_detail.html 商品详情页

    查数据库,展示商品详情,可点击秒杀功能,基础版本秒杀逻辑如下(效率低,而且有bug)

    1.查询数据库,判断库存

    2.查询秒杀订单表,判断这个用户是否已经秒杀过这个商品

    3.进入秒杀事务:减库存、下订单、下秒杀订单

    4.成功后进入订单详情页

  • order_detail.html 订单详情页

2.秒杀接口优化

页面缓存技术:

以商品列表页为例,进行页面缓存

页面静态化技术:

以商品详情页和订单详情页为例,采用页面静态化技术,前后端分离

秒杀逻辑优化:

  1. 系统初始化时,将秒杀商品的库存放入redis中

  2. 预减库存,原子减redis中库存值,这里就可以过滤掉多余请求

  3. 判断该用户是否秒杀过商品,查redis中的订单缓存

  4. 利用RabbitMQ,异步入队:

    事务:

    4.1 数据库减库存,且库存>0才能成功

    4.2 库存减成功之后下单,且订单表userId设为唯一索引,保证没有重复秒杀

    4.3 成功下单后,将订单缓存到Redis中

  5. 返回给前端排队中

  6. 客户端不断的轮训/miaosha/result接口,查询有没有订单

3.安全优化

秒杀接口地址隐藏

验证码

接口限流防刷