StackExchange.Redis订阅排除_dev后缀频道glob匹配失效如何解决?
你遇到的问题核心是Redis的模式订阅(PSUBSCRIBE)不支持!(_dev)这类扩展glob否定语法。
Redis官方实现的glob匹配仅支持3种基础通配符:
*:匹配任意数量(包含0个)的任意字符?:匹配单个任意字符[]:匹配括号内的单个字符,支持范围匹配(如[0-9]、[a-z])和排除匹配(如[^_]匹配非下划线的单个字符)
你在非Debug模式下拼接出的CommandChannel_*!(_dev)模式对Redis而言是普通字符串,无法匹配任何符合规则的频道,所以收不到消息。
解决方案
方案1:回调层过滤(最通用,无额外限制)
直接订阅所有CommandChannel_开头的频道,在消息回调中按后缀过滤,仅处理符合当前模式的消息,改造成本最低:
string subBase = "CommandChannel_"; redisSubscription.SubscribeAsync(subBase + "*", async (channel, message) => { string channelName = channel.ToString(); // 按运行模式过滤 if (DEBUG) { if (!channelName.EndsWith("_dev")) return; } else { if (channelName.EndsWith("_dev")) return; } // 业务逻辑处理 });
方案2:精准模式订阅(需ID格式符合要求)
如果你的<id>字段中本身不会包含下划线,可以用排除匹配语法实现精准订阅,避免订阅不必要的频道节省带宽:
string subBase = "CommandChannel_"; // 非Debug模式:匹配ID部分没有下划线的频道,自然排除带_dev后缀的内容 string pattern = DEBUG ? subBase + "*_dev" : subBase + "[^_]*"; redisSubscription.SubscribeAsync(pattern, async (channel, message) => { // 业务逻辑处理 });
这个方案的前提是<id>中不存在下划线,否则会漏匹配含下划线的ID对应的正式频道。
内容的提问来源于stack exchange,提问作者Doc。
相关产品推荐
相关产品推荐

