50个进程拿数据, 可能会拿到相同的数据, 如何处理?
来源:12-11 利用高性能的redis延迟队列处理无效订单(下)
happy技师
2020-03-05
请老师指点下
( mysql 要做一些方并发处理吧? 加锁 )
写回答
2回答
-
Lucar_陈
2020-03-05
老师本课抛出的问题,正好在这回答一下吧~~
多线程或多进程情况下,是有可能在zrangebyscore()步骤的时候拿到相同的任务,但是在zrem步骤的时候,redis里的zrem方法会决定唯一的抢占获取者,它的返回值决定了当前实例有没有获取到。
但是没获取到,又拿到任务的实例就浪费了一次,可以使用 Lua脚本来优化延时队列的逻辑,将轮询和争抢操作原子化,这样就可以避免竞争浪费。
40 -
singwa
2020-03-21
您好。因为redis是单进程单线程,多个pHP进程去redis拿数据, 不会出现重复的内容。
312021-10-21
相似问题