50个进程拿数据, 可能会拿到相同的数据, 如何处理?

来源:12-11 利用高性能的redis延迟队列处理无效订单(下)

happy技师

2020-03-05

请老师指点下
( mysql 要做一些方并发处理吧? 加锁 )

写回答

2回答

Lucar_陈

2020-03-05

老师本课抛出的问题,正好在这回答一下吧~~

多线程或多进程情况下,是有可能在zrangebyscore()步骤的时候拿到相同的任务,但是在zrem步骤的时候,redis里的zrem方法会决定唯一的抢占获取者,它的返回值决定了当前实例有没有获取到。

但是没获取到,又拿到任务的实例就浪费了一次,可以使用 Lua脚本来优化延时队列的逻辑,将轮询和争抢操作原子化,这样就可以避免竞争浪费。

4
0

singwa

2020-03-21

您好。因为redis是单进程单线程,多个pHP进程去redis拿数据, 不会出现重复的内容。

3
1
ericdemon
老师,我有个疑问,Redis虽然是单进程单线程,但是如果进程A先执行了zrangebyscore方法后,在进程A执行zrem方法前进程B就执行了zrangebyscore方法,那么这个时候其实进程A和进程B中是有可能出现重复数据的呀,为什么多个PHP进程去Redis里拿数据不会出现重复的内容呢
2021-10-21
共1条回复

全流程开发 TP6.0实战高并发电商服务系统

一课就能掌握TP6.0基础及运用,打造完整高并发的电商后端项目

1458 学习 · 1310 问题

查看课程