秒杀方案

1.首先前端页面静态化,缓存;

2.可通过Nginx或者gateway(网关)或者MQ来进行限流,以减小服务器压力;

3.商品数据可预先存放至Redis以减小数据库压力:

商品详情key:商品id+detail

              value:商品详情

商品库存key:商品id

              value:库存数量

4.页面可通过redis获取商品详情,判断秒杀时间等

5.秒杀开始后:

根据商品id获取redis中商品库存,若小于等于0则表示已抢光,否则可继续;redisTemplate.get(key)获取库存;

                                                     将redis中库存减1;redisTemplate.decr(key)库存减1;

这里获取商品数量和库存减1,需保证同步,有两种方案:一种是使用分布式锁将获取数量与库存减一锁住锁的key用商品id;

                          :一种是使用watch库存减一后库存数量是否小于0,若小于零则回滚,返回秒杀失败;

redis中获取商品成功后,通过mq异步将数据库商品库存减一,并插入订单,此处的修改商品库存和插入订单需在同一事物;

付款时通过用户id和商品id查订单表,如果存在则有效,如果不存在则表示上一步修改库失败,将redis商品库存加1,并返回秒杀失败;

参考文献:https://www.cnblogs.com/zyy1688/p/9638986.html

原文地址:https://www.cnblogs.com/luizw/p/11266119.html