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