Stackexchange.Redis 频道订阅模式(排除)

Stackexchange.Redis Channel Subscription Patterns (exclusions)

我正在尝试为 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 模式的任何频道上的所有消息。但是,当我将应用程序更改为不处于 DEBUG 模式时,尽管肯定会发布到适当的渠道 (CommandChannel_<id>),但我的订阅并没有捕捉到任何东西。据我了解,!(_dev) 应排除任何以 _dev 结尾的频道,但允许我期望的所有其他频道。

我在这里错过了什么?

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

Supported glob-style patterns:

  • h?llo subscribes to hello, hallo and hxllo
  • h*llo subscribes to hllo and heeeello
  • h[ae]llo subscribes to hello and hallo, but not hillo

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

  1. 对产品和开发使用单独的 servers/ports - 而不是模式
  2. 对所有逻辑tiers/tenants
  3. 使用活动模式(不是缺少模式)