秒杀抢购报名有没有什么好的方案

liqianmo

多SKU抢购

现在有个学生抢课程报名的项目,有很多的选修课定时让家长抢。为了防止抢超,使用了mysql事务。但多个项目同时开抢,几千个并发,mysql就直接挂掉了。

最近了解了一下redis消息队列,如果使用redis消息队列来处理,大家有没有比较好的方案分享。

1495 7 1
7个回答

zpw

可以使用PHP+redis乐观锁

  • 查表仔 2023-02-22

    在不加锁的情况下,貌似 Redis 的 list、set 的 sPop 都能实现吧,原子性操作,获取到就是还有库存,获取不到就是没有库存

  • liqianmo 2023-02-22

    这个对数据库的压力貌似还是很大。主要是不是怕卖超过,主要是mysql的瓶颈在哪里。

  • 小W 2023-02-22

    你这是两个问题,一是超卖,二是mysql自身瓶颈,超卖问题可以通过redis解决,mysql瓶颈可以通过队列优化

  • zpw 2023-12-06

    Redis 的 list、set 的 sPop 是原子操作 但是 是的单线程执行

a784910468

sql直接丢队列,结果先存redis

小W

redis+lua

  • 小W 2023-02-22

    在lua中执行查询和减库存操作

  • liqianmo 2023-02-22

    mysql端口的库存怎么操作。

  • 小W 2023-02-22

    最大限度减小同步时间就行

tanhongbin

这个用消息队列或者redis队列 list 最不济写一个lua 的 判断redis属于个数也可以的,很多实现方案呢,这里推荐redis list 然后其他操作入队列慢慢处理就可以了

  • 查表仔 2023-02-22

    lua的话是用纯脚本,还是用 php-redis 里的 lua?

  • liqianmo 2023-02-22

    目前思路应该大致就是先把库存缓存到redis,然后操作redis减库存,用户的下单请求放入队列,然后慢慢的消费下单。

  • tanhongbin 2023-02-22

    @查表仔 哪个都行,最后都是lua 操作redis

  • 查表仔 2023-02-22

    @tanhongbin 我有疑问老哥,lua 是原子操作,但是在并发情况下,用户A在执行lua脚本的时候,用户B此时也来执行 lua 脚本,那这个时候他是阻塞的吧,单个脚本是原子性,但是多个进程操作单个脚本,是否是阻塞的?

  • tanhongbin 2023-02-22

    阻塞的,redis是单线程的,就是lua你必须执行完了,下一个才会执行

查表仔

截图

chatgpt的答案

  • liqianmo 2023-02-22

    面向chatgpt编程

  • 小W 2023-02-22

    开通一个chagpt的接口,可以在提问题的时候,自动回复答案,[哈哈]

guanhui07

队列,锁

  • tanhongbin 2023-02-22

    用那种都行,最好是队列,锁还有进程关了没释放,只能等失效的问题,list最好了,抢课就是30节课,只能三个学生抢,list里面30个,rpop没了就是没了,做好失败了还原库存的问题即可

luohonen

用一个简单队列就能搞定的事情,说那么多其他更复杂的干什么

  • 小W 2023-02-22

    其实跟那个自动收货的问题,一个答案 O(∩_∩)O

年代过于久远,无法发表回答
×
🔝