*Redis SUBSCRIBE 命令

订阅一个或多个频道的消息。


*语法

SUBSCRIBE channel [channel ...]

*参数说明

参数 类型 必填 说明
channel String 频道名,可订阅多个

*返回值

进入订阅模式,持续接收消息。每条订阅确认返回 ["subscribe", channel, count]


*时间复杂度

O(N),N 为订阅的频道数量。


*示例

> SUBSCRIBE news sports
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "subscribe"
2) "sports"
3) (integer) 2

# 收到消息时
1) "message"
2) "news"
3) "Breaking news!"

*常见错误

错误 原因 解决
ERR wrong number of arguments 未指定频道名 至少提供一个频道名
连接阻塞 SUBSCRIBE 后连接进入阻塞模式 使用独立连接订阅
重复订阅同一频道 同一频道订阅多次 避免重复订阅

*最佳实践

  1. 专用连接订阅:SUBSCRIBE 后连接进入订阅模式,只能执行 SUBSCRIBE/UNSUBSCRIBE/PSUBSCRIBE/PUNSUBSCRIBE/PING/QUIT。生产环境用独立连接订阅。
  2. 断线重连:客户端库应自动处理断线重连和重新订阅。

  3. 频道命名规范:使用前缀区分业务模块,如 order:createduser:login,避免频道名冲突。

  4. 订阅数量控制:单个连接订阅过多频道会消耗内存,建议频道数量控制在 1,000 以内。

*5. 心跳检测:订阅模式下定时发送 PING 命令,检测连接健康状态,及时发现断线。

*FAQ

Q1: SUBSCRIBE 后可以执行其他命令吗? A: 不可以。订阅模式下只能执行少数几个命令。需要其他命令用额外连接。

Q2: 订阅多个频道会收到重复消息吗? A: 不会。一个消息只推送一次到每个客户端,即使客户端订阅了多个匹配频道。

Q3: SUBSCRIBE 支持模式匹配吗? A: 不支持。需要模式匹配请使用 PSUBSCRIBE,如 PSUBSCRIBE news:*

Q4: 订阅模式下连接断开会丢失消息吗? A: 会。断线期间发布的消息无法补发,需要业务层设计消息持久化或使用 Stream。

Q5: 一个客户端可以订阅多少个频道? A: 没有硬性限制,但订阅越多内存占用越高,且连接断线重连成本越大。