【问题标题】:Is StackExchange.Redis client restricted when subscribed to a channel?订阅频道时 StackExchange.Redis 客户端是否受到限制?
【发布时间】:2017-06-20 09:17:36
【问题描述】:

我想使用 StackExchange.Redis 开发一个 PUB/SUB 消息队列。

在 StackExchange.Redis 文档中指定:

-数据不是通过pub/sub发送的; pub/sub API 仅用于通知工作人员检查更多工作

所以我知道,一旦订阅的工作人员通过 PUB/SUB 检测到通知,我可能需要使用其他 redis 操作(如 LPOP)来检查工作。

然而 Redis 参考指定:

一旦客户端进入订阅状态,它不应该 发出任何其他命令,除了额外的 SUBSCRIBE、PSUBSCRIBE、 UNSUBSCRIBE 和 PUNSUBSCRIBE 命令。

对于 StackExchange.Redis,我是否应该在我的订阅处理程序中创建另一个多路复用器来发出 LPOP 之类的命令?

是否可以为订阅和其他命令共享同一个多路复用器?

我的员工在收到检查工作的通知时是否应该取消订阅?

【问题讨论】:

    标签: redis publish-subscribe stackexchange.redis


    【解决方案1】:

    您是否尝试使用共享多路复用器?

    不,仅使用一个 ConnectionMultiplexer 并订阅您想要的任意数量的东西并用它做其他事情绝对没有问题,因为 Stackexchange.Redis 客户端会在幕后为您完成所有事情。它确实在内部处理订阅者的新连接。

    意思是,不,你不必每次都创建一个新的多路复用器,不,你不必发出任何其他命令来使用订阅者。

    只需创建一个新订阅者

    ISubscriber sub = redis.GetSubscriber();
    

    然后订阅你想要的任何东西

    sub.Subscribe("messages", (channel, message) => {
        Console.WriteLine((string)message);
    });
    

    或发送消息

    sub.Publish("messages", "hello");
    

    正如Marc's docs中所解释的那样

    【讨论】:

    • 我知道我可以只用一个多路复用器订阅多个频道,但是如果我想使用同一个 ConnectionMultiplexer 执行其他 Redis 操作而不是处理程序中的 Console.WriteLine 怎么办? Redis 文档声明我不应该这样做,因为处于订阅状态的客户端不应该发出更多命令。 StackExchange.Redis 是否不受此限制?
    • 我回答得不够清楚吗?是的,您可以对所有事情使用一个多路复用器。您不必再创建一个...到目前为止,您是否尝试过?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多