天天看点

超卖问题解决方案

超卖问题解决方案:

1,首先,解决一下当网络不好时,用户多次点击提交造成的多订单问题,可以在秒杀表中对用户id和商品id和本次活动的code进行一个唯一索引约束,可以避免多插入。

(不是很靠谱,根据阿里规约上面那个唯一约束肯定要加的,根据墨菲定律。。。)还有一种解决方案是,通过布隆过滤器来实现重复提交限制

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

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

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

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

继续阅读