一.秒杀流程(凭自身理解画的,若有误请评论区指正)
二. 细节介绍(总结)
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,表示排队中,继续轮询。
最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429
/./*欢迎加入java交流Q君样:909038429一起吹水聊天