抢购秒杀的场景使用锁个人认为不太合理?

在抢购秒杀的构架设计中,网上很多都说为了防止超卖现象,应该使用锁机制来做,只有拿到锁的用户才能抢购下单;但是我觉得这个不太合理,在高并发下使用锁,一来造成请求阻塞,二来会造成抢购的不公平现象。

所以我觉得正确的设计应该是
1.抢购商品入队列,比如:redis队列,10个商品队列中就有10个元素。通过pop来取,这样避免了超卖现象。能取到元素说明抢购成功

2.由于秒杀是高并发的,所以需要异步下单处理,同样的可以把抢单成功的用户也加入到队列中比如:rabbitmq消息队列,通过消费者来处理订单数据的生成

不知道还有没有更好的解决方案?

阅读 3.8k
3 个回答

首先说两点

  1. 队列的用法有限流,限制的是商品整个 Entity 的流量,不是请求的流量
  2. 其次你这个 pop 的操作,你就默认了是线程安全的,的确是这个样子的(但其实现必定有类似加锁的操作),不然假设有两个消费者 pop 出同一个商品。所以既然 pop 这个操作有类似加锁的操作。同样用 redis 也是一个加锁的操作,所以加锁是不可避免的

大体一样,细节需要注意:

  1. 用户进来时以用户 ID 生成 key通过 SET NX判断是否存在(秒杀一般只能下一单),如果SET NX失败,证明用户重复请求了,return
  2. 去商品队列pop一下,如果失败,证明卖完了,return
  3. 数据库逻辑
新手上路,请多包涵

操作redis队列 reds不是单线程么 还用啥队列啊?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题