秒杀业务场景
秒杀业务:传入商品id后,首先判断库存,若库存小于等于0,接着根据用户id和商品id判断是否已经秒杀过,最后减库存,生成订单。
页面缓存:1.取缓存 2.手动渲染(Thymleaf)页面缓存都设置有效期,适合变化不大的
对象缓存:1.通过id取缓存对象 2.取数据库,加入到缓存中 不设置有效期
页面静态化:利用ajax设置倒计时开启秒杀
防止秒杀超了:在数据库减库存语句加stock > 0的判断条件,数据库会对update加锁
防止用户连续秒杀:建用户id-商品id唯一索引,如果插入失败回滚,用验证码
并发的瓶颈主要在数据库,可以加缓存,首先用户发起请求,页面静态化,页面缓存到浏览器端,先分发到CDN节点,还可以用nginx加缓存,nginx也没有,可以页面缓存,最后还有对象缓存,最后才到数据库(缓存造成数据的不一致)
利用mq同步下单改成异步下单:
1.把商品库存加载到redis
2.收到请求redis预减库存,库存不足则返回失败
3.若不失败,则请求入队
4.请求出队,生成订单,减少库存
5.客户端查询是否秒杀成功(结果返回redis)