Redis Cluster 不支持 SUBSCRIBE 等 Pub/Sub 命令,因其无 key 无法路由到 slot;SSUBSCRIBE/SPUBLISH 是唯一替代方案,要求频道名满足 slot 规则;键空间通知需为每个 master 节点单独订阅并管理连接。

会失效,而且不是偶发问题,是集群模式下必然发生——SUBSCRIBE 命令在 Redis Cluster 中根本不可用,直接报错。
执行 SUBSCRIBE 时提示 ERR This Redis command is not allowed in cluster mode
Redis Cluster 架构不支持无 key 的命令路由,而 SUBSCRIBE 没有 key 参数,无法映射到某个 slot,所以服务端直接拒绝执行。这不是配置没开、也不是权限问题,是硬性限制。
- 用
redis-cli -c连集群后执行SUBSCRIBE chat,立刻返回错误 - 某些客户端(如老版本
jedis)调用publish()或subscribe()时抛JedisClusterException,但堆栈里看不到具体命令被拒,容易误判为连接问题 -
PUBSUB CHANNELS、PUBSUB NUMSUB等配套命令同样被禁用,无法查订阅状态
SSUBSCRIBE 是唯一能用的替代方案,但和传统 Pub/Sub 不兼容
Redis 7.0+ 提供了 SSUBSCRIBE/SPUBLISH,它们强制频道名必须落在固定 slot 上(比如带 {chat} 标签),所有操作都只发生在该 slot 所在节点。但它不是“让旧代码跑起来”的补丁,而是全新语义。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 频道名必须满足 slot 计算规则,例如
{room}123或room:123(需确认CLUSTER KEYSLOT room:123返回稳定值) - 不能跨 slot 订阅,
SSUBSCRIBE {user}123和SSUBSCRIBE {order}456必须连不同节点 -
redis-py3.5+ 才支持ssubscribe,旧版库调用会报AttributeError或静默失败 - 没有
SPSUBSCRIBE,通配符订阅完全不可用
想用键空间通知(Keyspace Notification)?每个节点得单独连、单独订阅
键空间通知(如 __keyevent@0__:expired)在 Cluster 中是按节点独立触发的,不是全局广播。你不能靠一个订阅覆盖整个集群,必须为每个 master 节点建立独立连接并分别 SUBSCRIBE。
- 需要自己发现集群拓扑(
CLUSTER NODES)、筛选出 master 节点、逐个建连接 - 节点增减或主从切换后,原有订阅连接断开,必须监听
+switch-master事件并重建对应连接 - 如果只连一个节点,那只有该节点上过期的 key 才能触发通知,其他节点的 key 变更完全收不到
-
notify-keyspace-events配置必须在每个节点上单独设置,不能通过集群命令批量下发
真正麻烦的不是“怎么写对”,而是“怎么兜住故障”:连接断开没人自动重连,节点迁移后订阅丢失没人补,多个连接各自收一半事件还得业务层合并。这些都不是配置开关能解决的,得实打实写拓扑感知和连接管理逻辑。

















