一文带你秒杀系统学习笔记

一.秒杀流程(凭自身理解画的,若有误请评论区指正)
在这里插入图片描述

二. 细节介绍(总结)
A.首先将秒杀商品列表页缓存在redis中,秒杀请求通过redisservice.get()得到秒杀商品列表.html。

B.用户通过秒杀商品列表.html找到想要秒杀的商品,点击详情,进入该商品的秒杀页。

C.点击秒杀按钮:

1.如果用户为空,返回登录页面

2.预减少库存,减少redis里面的库存。

3.判断缓存redis中库存数量减1后的大小是否大于或等于0。如果小于0,报:“商品秒杀完毕,库存不足”,反之继续往下执行。

4.在MySQL中判断“秒杀订单”表中该用户id,以及该商品id是否已经存在,避免一个用户重复秒杀。如果重复秒杀,报:“该商品不能重复秒杀”,否则,继续往下执行。

5.发送一个秒杀message到rabbitMQ队列中去(MQsender.sendmessage(message)),该message 包含用户信息user和商品id:goodsid。(入队之后客户端会对redis进行轮询,判断redis中是否生成了该商品的秒杀订单。)

6.rabbitMQ监听到message信息,开始业务逻辑秒杀:

首先访问mysql根据message中的goodsid得到秒杀商品的信息goodsVo。

然后判断该goodsVo的库存数是否充足,如果小于等于0,则return。如果大于0,则继续往下执行。

根据用户id和goodId判断mysql中的秒杀订单表中该订单是否已经存在,避免重复秒杀。

如果没有重复,则执行秒杀操作。原子操作:1.库存减1,2.下订单,3.写入秒杀订单—>是一个事务

操作mysql减少库存,判断库存更新后是否大于0,如果大于0,继续往下执行

操作mysql下订单,其中有两个订单,order_info和miaosha_order。最后在redis中缓存秒杀订单miaosha_order 格式为(OrderKey.getMiaoshaOrderByUidAndGid, “”+user.getId()+"_"+goodsvo.getId(), miaoshaorder)--------》(prefix,key, value)格式。

7.前端轮询redis,通过用户id和商品id拼接为key值,通过redisservice.get(prefix,key,class)获取秒杀订单,通过miaoshaorder.getorderId获得订单id

前端收到订单的id,秒杀成功,进入支付页面。

前端收到-1,表示库存不足,秒杀失败

前端收到0,表示排队中,继续轮询。
image
最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429
/./*欢迎加入java交流Q君样:909038429一起吹水聊天


版权声明:本文为xiaochengxuyuan1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。