我正在尝试使用 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
结果。
最佳答案
标准弹出操作不会阻塞:如果列表为空或不存在,它们会返回 nil。
SE.Redis 是一个多路复用器。使用阻塞 pop 是一个非常非常糟糕的主意。在文档中对此进行了更多解释,并专门讨论了用于阻止 pops 的解决方法:https://stackexchange.github.io/StackExchange.Redis/PipelinesMultiplexers
关于c# - StackExchange.Redis ListRightPop 不等待结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747211/