我有一种producer-consumer设置,其中producer(不同线程上的多个producer)将数据排队到redis队列中,consumer(单个线程上的单个consumer)监视这个队列。当队列长度达到(比如>=10000个项目)时,使用者应该从队列中提取前10000个项目,将它们从队列中删除,并对其进行某种计算。
使用redis py客户端,我使用以下代码提取前10000个项目,并将其删除:
logs = REDIS_CLIENT.lrange(task_queue, 0, 9999)
REDIS_CLIENT.ltrim(task_queue, start=10000, end=REDIS_CLIENT.llen(task_queue))
(lrange和ltrim文件)
我的问题是,这里是否有数据丢失的机会?例如,在调用函数ltrim()和实际修剪队列(在这种情况下,最新的日志将丢失,因为end的值将是较旧的长度)之间,任务是否可能排队?或者在ltrim操作完成之前是否在队列上放置了一个锁?
1条答案
按热度按时间uubf1zoe1#
是的,您可能会丢失数据,因为两者之间有一个时间窗口
ltrim
以及llen
.要关闭该时间窗口,可以设置
-1
作为结束偏移: