1、使用redis缓存商品信息
2、互斥锁解决缓存击穿问题,用缓存空值解决缓存穿透问题。
3、CAS乐观锁解决秒杀超卖的问题
4、使用redission实现一人一单。(分布式锁+lua)脚本。
为什么使用分布式锁(因为sychronized只在一个JVM中生效,如果分布式部署,就会出现问题)
5、使用lua脚本进行秒杀资格判断(将库存和用户下单成功后的订单写入到缓存中,每次进来先用lua脚本进行判断)
6、将信息放入消息队列中,然后直接返回0表示排队中,后续客户端轮询查看结果。
7、在消息队列中,我们处理信息,查数据库(1、如果我们查到数据库库存为空,并且返回库存不足。并且在stockEmpty:商品id作为key,值标记为0。2、如果处理下单成功,将订单信息缓存并返回订单)
8、前端就通过回调getResult()方法,查到订单就返回订单id,如果库存为空就返回-1,0就代表还在排队中。
前端查到后就进行相应的处理