redis-队列修剪期间数据丢失的可能性

nue99wik  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(396)

我有一种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操作完成之前是否在队列上放置了一个锁?

uubf1zoe

uubf1zoe1#

是的,您可能会丢失数据,因为两者之间有一个时间窗口 ltrim 以及 llen .
要关闭该时间窗口,可以设置 -1 作为结束偏移:

REDIS_CLIENT.ltrim(task_queue, start=10000, end=-1)
``` `-1` 表示列表的结尾,不需要显式指定结束偏移量。

相关问题