如何解决超卖问题

从数据库层面上看

我们可以查询商品数量的时间加上个 for update ,这样子就会加上一个X 锁,别的线程 如果查询的时候也添加了for update 则因为拿不到锁而进入阻塞,只有拿到锁才能进行商品数量查询。

第二种就是在set 商品数量的时候 要进行 where限制,只有商品数量大于1的时候才能进行减少

我们可以利用一下分布式锁

一个简单的方法是设置一个reddision分布式锁,只有拿到redission分布式锁的才可以对商品数量进行修改,但是这样也会有一个坏处,即同一时间只能处理一个用户的请求

一个好的解决方法就是利用分布式锁加分段,比如有200个商品,我可以设置 5个key与 value即,key根据用户id%5 取余后看落到那个key就对那个key发起请求,value即商品数量,这样子的话在同一时候可以处理5个用户的请求,提高了并发性。

还有一种方案是利用redis 自带的decre的原子性能

当用户购买商品时,如redis商品数目为0则直接返回秒杀失败,>0则在redis中将商品数目减1然后将用户的购买订单加入到异步队列中,并返回给用户正在秒杀中。另外一个线程可以消费这个异步队列,若用户的订单成功出列,则将数据库的商品数目-1并发送给用户的秒杀成功订单。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值