必须使用ssubscribe和spublish才能实现跨槽消息路由,否则subscribe仅监听本地分片,导致publish返回0且无提示;需用花括号指定稳定分片键,如{user:1001}:notify,并启用shard-subscribe-enabled及对应acl权限。

必须显式用 SSUBSCRIBE 和 SPUBLISH,否则还是走全集群广播,性能不会改善。
为什么 SUBSCRIBE 在集群里收不到跨槽消息
Redis Cluster 默认不支持传统 Pub/Sub 的跨节点路由。当你在节点 A 上执行 SUBSCRIBE order:1001,它只监听本节点负责的 slot;如果 order:1001 实际落在节点 B 的 slot 上,那这条订阅就“挂空挡”——发过去的消息根本不会被投递,PUBLISH 返回 0,你也收不到任何提示。
- 现象:客户端没报错,但
PUBLISH返回(integer) 0,且订阅端静默无响应 - 原因:传统命令不带分片语义,Redis 不知道该把 channel 映射到哪个节点
- 本质不是 bug,是设计限制:Cluster 模式下
SUBSCRIBE仅作用于本地分片
SSUBSCRIBE 必须配合可哈希的 channel 名或显式 shard key
SSUBSCRIBE 不是简单换命令,它依赖 Redis 的 slot 计算机制来定位目标节点。channel 名必须能稳定映射到某个 slot,否则路由失败。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 推荐写法:用花括号包裹分片标识,例如
SSUBSCRIBE {user:1001}:notify——{user:1001}决定 slot,后面内容忽略 - 错误写法:直接
SSUBSCRIBE user:1001:notify,可能因 key hash 结果漂移,导致订阅和发布落到不同节点 - 注意:
SPUBLISH在 Redis 7.0+ 有两个变体:带 shard key 的SPUBLISH ch 1001 "msg"(需显式传第二参数),或依赖 channel 名 hash 的SPUBLISH {user:1001}:notify "msg";两者不可混用
客户端 SDK 不支持就等于白配
绝大多数旧版驱动(如 redis-py 、<code>jedis )压根没有 <code>sSubscribe() 或 sPublish() 封装。直接调原生命令容易出错,且无法复用连接池、重连、ACL 等基础设施。
- 检查方法:运行
redis-cli -c连集群,手动输SSUBSCRIBE test,若返回ERR unknown command,说明服务端未启用或版本不对 - 确认配置:
shard-subscribe-enabled yes必须在redis.conf中显式开启,重启生效 - ACL 权限:若启用了 ACL,需给用户授权
shardsubscribe和shardpublish权限,不能只给subscribe/publish
最常被忽略的一点:Sharded Pub/Sub 天然不支持通配符。如果你靠 PSUBSCRIBE order.* 做动态路由,迁移到 SSUBSCRIBE 后这条路就断了——得改业务逻辑,把通配需求拆成明确的分片键,或者换用 Stream + 消费者组。










