vai*_*olo 2 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);
Run Code Online (Sandbox Code Playgroud)
nil不到1秒后我得到了结果。
标准的弹出操作不会阻塞:如果列表为空或不存在,则它们返回nil。
SE.Redis是一个多路复用器。使用阻塞弹出是一个非常非常糟糕的主意。在文档中对此进行了详细说明,并专门讨论了阻止弹出窗口的解决方法:https : //stackexchange.github.io/StackExchange.Redis/PipelinesMultiplexers