防止库存超卖方法总结

1、简单处理【update & select 合并】(乐观锁)

2、使用redis队列

实现的方式是用的redis的list队列,框架为laravel

核心部分为list的pop操作,此操作为原子性,即使很多用户同时到达,也是依次执行

2.mysql 当mysql单表的数据量大于1000万行时,建议进行水平分拆。

利用redis的incr、decr的原子性做操作
redis的lpush、rpop的原子性做操作,但是这个只能一个一个的扣,但不能原子地同时扣多个
sql乐观锁

 

 

 

二、扣减库存
安全扣减库存方案有很多说法,列一下几个方案和我推荐的方案。

方案一:分布式锁
有的文章会用redis分布式锁来做保证扣库存数量准确的环节,让点击结算时,后端逻辑会查询库存和扣库存的update语句同时只有一条线程能够执行,以商品id为分布式锁的key,锁一个商品。但是这样,其他购买相同商品的用户将会进行等待。

优点:这样做虽然安全
缺点:但是失去的是性能问题。
方案二:分布式锁+分段缓存
也有文章会说借鉴ConcurrenthashMap,分段锁的机制,把100个商品,分在3个段上,key为分段名字,value为库存数量。用户下单时对用户id进行%3计算,看落在哪个redis的key上,就去取哪个。

 

posted @ 2021-07-13 12:40  小蚊子大人KN  阅读(999)  评论(0编辑  收藏  举报