超卖问题解决方案

1、将库存等映射到redis缓存中,秒杀可以快速响应扣库存等操作,然后将处理好的数据放入消息队列,在后台慢慢处理。

2、使用redis的分布式锁来实现,每秒10万并发肯定够的估计,但是处理库存等数据库操作估计20ms左右,当然机器性能好或优化好,表设计的好应该比这个低,算下来20*50=1000 ,大概也就是每秒可以处理50个请求,大的秒杀场景估计不够用,可以考虑库存分在多行进行存储,分段概念,这样分布式锁也是分段的,实现起来感觉比较复杂

3、使用乐观锁,查询数据库时,会同时把商品信息和该条记录的版本号这个字段version都查询出来,这个version会在有更新时进行+1操作,然后当要进行扣库存操作时加上一个条件update table set stock=stock-1 where version=#{version} 如果这个version相等说明没人修改过这个值,那么就更新完成,否则就失败,那么就继续秒杀,重试

4、使用mysql的事务隔离级别,select stock from table where id =1 for update; update set stock=stock-1 where id=1 这样对这个商品的操作变成了串行的了,其它的操纵都必须等待上一个事务完全提交后才能操作,效率太低,对于一般的小秒杀场景可以使用,实现较简单。

5、首先,解决一下当网络不好时,用户多次点击提交造成的多订单问题,可以在秒杀表中对用户id和商品id和本次活动的code进行一个唯一索引约束,可以避免多插入。
(根据阿里规约上面那个唯一约束肯定要加的,根据墨菲定律)
还有一种解决方案是,通过布隆过滤器来实现重复提交限制

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值