一个简单的秒杀系统,从最基本功能版本到秒杀接口优化版本到安全方面优化版本
基于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 订单详情页
以商品列表页为例,进行页面缓存
以商品详情页和订单详情页为例,采用页面静态化技术,前后端分离
-
系统初始化时,将秒杀商品的库存放入redis中
-
预减库存,原子减redis中库存值,这里就可以过滤掉多余请求
-
判断该用户是否秒杀过商品,查redis中的订单缓存
-
利用RabbitMQ,异步入队:
事务:
4.1 数据库减库存,且库存>0才能成功
4.2 库存减成功之后下单,且订单表userId设为唯一索引,保证没有重复秒杀
4.3 成功下单后,将订单缓存到Redis中
-
返回给前端排队中
-
客户端不断的轮训/miaosha/result接口,查询有没有订单