StackExchange.RRedis ListRightPop没有等待结果

本文关键字:等待 结果 RRedis ListRightPop StackExchange | 更新日期: 2023-09-27 18:21:09

我正在尝试使用C#中的Redis编写一个生产者/消费者系统。生成的每条消息只能由一个使用者使用,我希望使用者等待使用者创建的元素。我的系统必须支持许多生产/消费集。

我使用StackExchange.Redis与Redis通信,并使用列表,其中使用ListLeftPush添加元素,使用ListRightPop删除元素。我所经历的是,虽然ListRightPop方法应该阻塞,直到列表中存在元素(或在定义的超时之后),但如果列表中没有元素,它总是自动返回。这是我写的测试代码来检查这个:

IDatabase cache = connection.GetDatabase();        
Trace.TraceInformation("waiting "+DateTime.Now);
var res = cache.ListRightPop("test");
Trace.TraceInformation("Got "+res+", Ended" + DateTime.Now);

不到1秒后,我就得到了nil的结果。

StackExchange.RRedis ListRightPop没有等待结果

标准的pop操作不阻塞:如果列表为空或不存在,则返回nil。

Redis是一个多路复用器。使用阻塞pop是一个非常非常糟糕的主意。这一点在文档中有更多的解释,其中专门讨论了阻止弹出窗口的解决方法:https://stackexchange.github.io/StackExchange.Redis/PipelinesMultiplexers

StackExchange.Redis只是访问Redis服务器公开的API,在您的情况下,其相关方法是BRPOP。文件是:

http://redis.io/commands/blpop-阻止左弹出

http://redis.io/commands/brpop-阻止右弹出

虽然这些方法确实描述了您正在寻找的阻塞行为,但我相信SE.RRedis ListRightPop正在调用

http://redis.io/commands/rpop-右弹出

我可能没有达到最新的SE.RRedis软件包,但intellisense并没有像你所说的那样给我提供超时选项。此外,在IDatabase接口中似乎没有任何以.List开头的方法包含"块"一词,所以我不确定SE.RRedis是否公开了Redis BRPOP API。你可以自己写,也可以很好地询问Marc Gravell,但我认为这是一个相当大的请求,因为调用的阻塞性和多路复用器的工作方式。