秒杀的并发问题

用表存放库存设计:
    秒杀的是商品,那么用于秒杀活动的商品放入一单表,每个被秒杀商品放一行。
a.查询还有没有货
    数量从js中取,js文件由后端定时生成。
b.用户秒杀
    用户点击抢购/下订单按钮。
    时间控制,是否在秒杀时间内。
    这里限流,比如QPS大于1千就直接返回秒杀失败了,适合商品数较少的情况。
    可以从mysql从库查询,
    select * from product where is_sale=0 limit 1

    update product set is_sale=1 where id=?

    返回updateCount=1,那么秒杀成功,返回updateCount=0,那么秒杀失败(概率比较小),重试一次,失败就返回秒杀失败。
    成功就可以生成订单了。

用redis存放商品数量设计:
    初始化数量到redis,如storeNum,10
    时间控制,是否在秒杀时间内。

    利用Decr来扣减库存,decr storeNum,如果返回<=-1,那么就没有库存了。
    其实扣减库存后就可以insert订单表了,一般insert并不会有太大的数据库压力。如果还有别的复杂操作比如判断是否有同一用户秒杀了多次,可以放入mq,再异步消费。




文/程忠 浏览次数:0次   2020-06-04 18:09:46

相关阅读


评论: