【问题标题】:Stackexchange.Redis Channel Subscription Patterns (exclusions)Stackexchange.Redis 频道订阅模式(排除)
【发布时间】:2021-11-15 04:11:47
【问题描述】:

我正在尝试为 Redis 订阅编写一个频道模式,这样,当我的应用程序处于调试模式时,我订阅所有以 _dev 结尾的频道,但当不处于调试模式时,我订阅所有特别_dev结尾的频道。我的频道类似于:CommandChannel_<id>CommandChannel_<id>_dev

我知道,根据文档,“所有 glob 样式的模式都是有效的”,所以我写了一个我觉得应该可以解决问题的模式:

string subBase = "CommandChannel_"
redisSubscription.SubscribeAsync(subBase + "*" + (DEBUG ? "_dev": "!(_dev)"), async (channel, message) =>
{
    // Do stuff
}

我发现,在 DEBUG 模式下,我的订阅工作正常 - 我正确地“捕获”了与 CommandChannel_<id>_dev 模式匹配的任何频道上的所有消息。但是,当我将应用程序更改为不处于调试模式时,尽管肯定会发布到适当的频道 (CommandChannel_<id>),但我的订阅不会捕获任何内容。据我了解,!(_dev) 应该排除任何以_dev 结尾的频道,但允许我期望的所有其他频道。

我在这里错过了什么?

【问题讨论】:

    标签: c# redis glob stackexchange.redis


    【解决方案1】:

    Redis 本身不支持这种用法; relevant docs:

    支持的全局样式模式:

    • h?llo 订阅 hellohallohxllo
    • h*llo 订阅 hlloheeeello
    • h[ae]llo 订阅 hellohallo,但不订阅 hillo

    没有提到排除项,并且在 redis-cli 中进行测试:不起作用。建议:

    1. 对 prod 和 dev 使用单独的服务器/端口 - 不是模式
    2. 对所有逻辑层/租户使用活动模式(而不是缺少模式)

    【讨论】:

    • 该死,这就是我害怕的。 redis.io/topics/pubsub 文档是我引用的内容,提到“所有 glob 样式模式都是有效的”,这是我所依赖的准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多