现在有个学生抢课程报名的项目,有很多的选修课定时让家长抢。为了防止抢超,使用了mysql事务。但多个项目同时开抢,几千个并发,mysql就直接挂掉了。
最近了解了一下redis消息队列,如果使用redis消息队列来处理,大家有没有比较好的方案分享。
可以使用PHP+redis乐观锁
在不加锁的情况下,貌似 Redis 的 list、set 的 sPop 都能实现吧,原子性操作,获取到就是还有库存,获取不到就是没有库存
这个对数据库的压力貌似还是很大。主要是不是怕卖超过,主要是mysql的瓶颈在哪里。
你这是两个问题,一是超卖,二是mysql自身瓶颈,超卖问题可以通过redis解决,mysql瓶颈可以通过队列优化
Redis 的 list、set 的 sPop 是原子操作 但是 是的单线程执行
sql直接丢队列,结果先存redis
谢谢解惑
redis+lua
在lua中执行查询和减库存操作
mysql端口的库存怎么操作。
最大限度减小同步时间就行
这个用消息队列或者redis队列 list 最不济写一个lua 的 判断redis属于个数也可以的,很多实现方案呢,这里推荐redis list 然后其他操作入队列慢慢处理就可以了
lua的话是用纯脚本,还是用 php-redis 里的 lua?
目前思路应该大致就是先把库存缓存到redis,然后操作redis减库存,用户的下单请求放入队列,然后慢慢的消费下单。
@查表仔 哪个都行,最后都是lua 操作redis
@tanhongbin 我有疑问老哥,lua 是原子操作,但是在并发情况下,用户A在执行lua脚本的时候,用户B此时也来执行 lua 脚本,那这个时候他是阻塞的吧,单个脚本是原子性,但是多个进程操作单个脚本,是否是阻塞的?
阻塞的,redis是单线程的,就是lua你必须执行完了,下一个才会执行
chatgpt的答案
面向chatgpt编程
开通一个chagpt的接口,可以在提问题的时候,自动回复答案,[哈哈]
队列,锁
用那种都行,最好是队列,锁还有进程关了没释放,只能等失效的问题,list最好了,抢课就是30节课,只能三个学生抢,list里面30个,rpop没了就是没了,做好失败了还原库存的问题即可
用一个简单队列就能搞定的事情,说那么多其他更复杂的干什么
其实跟那个自动收货的问题,一个答案 O(∩_∩)O
可以使用PHP+redis乐观锁
在不加锁的情况下,貌似 Redis 的 list、set 的 sPop 都能实现吧,原子性操作,获取到就是还有库存,获取不到就是没有库存
这个对数据库的压力貌似还是很大。主要是不是怕卖超过,主要是mysql的瓶颈在哪里。
你这是两个问题,一是超卖,二是mysql自身瓶颈,超卖问题可以通过redis解决,mysql瓶颈可以通过队列优化
Redis 的 list、set 的 sPop 是原子操作 但是 是的单线程执行
sql直接丢队列,结果先存redis
谢谢解惑
redis+lua
在lua中执行查询和减库存操作
mysql端口的库存怎么操作。
最大限度减小同步时间就行
这个用消息队列或者redis队列 list 最不济写一个lua 的 判断redis属于个数也可以的,很多实现方案呢,这里推荐redis list 然后其他操作入队列慢慢处理就可以了
lua的话是用纯脚本,还是用 php-redis 里的 lua?
目前思路应该大致就是先把库存缓存到redis,然后操作redis减库存,用户的下单请求放入队列,然后慢慢的消费下单。
@查表仔 哪个都行,最后都是lua 操作redis
@tanhongbin 我有疑问老哥,lua 是原子操作,但是在并发情况下,用户A在执行lua脚本的时候,用户B此时也来执行 lua 脚本,那这个时候他是阻塞的吧,单个脚本是原子性,但是多个进程操作单个脚本,是否是阻塞的?
阻塞的,redis是单线程的,就是lua你必须执行完了,下一个才会执行
chatgpt的答案
面向chatgpt编程
开通一个chagpt的接口,可以在提问题的时候,自动回复答案,[哈哈]
队列,锁
用那种都行,最好是队列,锁还有进程关了没释放,只能等失效的问题,list最好了,抢课就是30节课,只能三个学生抢,list里面30个,rpop没了就是没了,做好失败了还原库存的问题即可
用一个简单队列就能搞定的事情,说那么多其他更复杂的干什么
其实跟那个自动收货的问题,一个答案 O(∩_∩)O