c# - StackExchange.Redis ListRightPop 不等待结果

标签 c# redis stackexchange.redis

我正在尝试使用 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/

相关文章:

c# - StackExchange.Redis.RedisTimeoutException - 由于问题人们如何解决它?

c# - StackExchange RedisValue ToByteArray 不可序列化

c# - 使用异步和等待的死锁

c# - 自增外键

c# - svcutil - 生成特定版本的代码

heroku - 具有结果的异步工作队列的正确方法是什么?

redis - seneca redis pubsub 传输和 seneca redis 队列传输有什么区别?

c# - 如何根据条件更改 DataGridview 中的列前景色?

mysql - Follower 系统,MySQL 好还是 Redis 好?

c# - Stackexchange.Redis ListRightPush "Invalid number of arguments"