【问题标题】:StackExchange.Redis ListRightPop not waiting for resultStackExchange.Redis ListRightPop 不等待结果
【发布时间】:2014-09-09 14:28:43
【问题描述】:

我正在尝试使用 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 结果。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    标准的弹出操作不会阻塞:如果列表为空或不存在,它们会返回 nil。

    SE.Redis 是一个多路复用器。使用阻塞弹出是一个非常非常糟糕的主意。在文档中对此进行了更多解释,并专门讨论了用于阻止弹出的解决方法:https://stackexchange.github.io/StackExchange.Redis/PipelinesMultiplexers

    【讨论】:

    • 像往常一样,最好直接上源码。
    • Marc - 感谢您的指点和出色的框架!会试试这个。不过,这是否意味着我们要对缓存服务器执行两次往返?大大降低了解决方案的性能:-(
    • @vainolo 不,这并不意味着 - 特别是如果您“解雇并忘记”广播。他们的管道非常好。至于发布/订阅,它的速度非常快——这就是我们为 web-sockets 服务器提供动力的方式,以便在 stackoverflow 上实时更新,它有 6 位数的已连接客户端。
    • 酷@MarcGravell。非常感谢!
    • @MarcGravell 你好。链接已损坏。 However there is a situation where I do need blocking BRPOP。所以就像 OP 所问的那样,我怎样才能阻止 BRPOP? (或其他替代方案)?
    【解决方案2】:

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

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

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

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

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

    我可能无法使用最新的 SE.Redis 包,但智能感知并没有像您声称的那样让我选择提供超时。此外,IDatabase 接口中似乎没有任何以.List 开头的方法,其中包含“块”一词,因此我不确定 SE.Redis 是否公开了 Redis BRPOP API。您可以自己编写或很好地询问 Marc Gravell,但我认为这是一个非常大的请求,因为调用的阻塞性质和多路复用器的工作方式。

    【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多