*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 后连接进入阻塞模式 | 使用独立连接订阅 |
| 重复订阅同一频道 | 同一频道订阅多次 | 避免重复订阅 |
*最佳实践
- 专用连接订阅:SUBSCRIBE 后连接进入订阅模式,只能执行 SUBSCRIBE/UNSUBSCRIBE/PSUBSCRIBE/PUNSUBSCRIBE/PING/QUIT。生产环境用独立连接订阅。
断线重连:客户端库应自动处理断线重连和重新订阅。
频道命名规范:使用前缀区分业务模块,如
order:created、user:login,避免频道名冲突。订阅数量控制:单个连接订阅过多频道会消耗内存,建议频道数量控制在 1,000 以内。
*5. 心跳检测:订阅模式下定时发送 PING 命令,检测连接健康状态,及时发现断线。
*FAQ
Q1: SUBSCRIBE 后可以执行其他命令吗? A: 不可以。订阅模式下只能执行少数几个命令。需要其他命令用额外连接。
Q2: 订阅多个频道会收到重复消息吗? A: 不会。一个消息只推送一次到每个客户端,即使客户端订阅了多个匹配频道。
Q3: SUBSCRIBE 支持模式匹配吗?
A: 不支持。需要模式匹配请使用 PSUBSCRIBE,如 PSUBSCRIBE news:*。
Q4: 订阅模式下连接断开会丢失消息吗? A: 会。断线期间发布的消息无法补发,需要业务层设计消息持久化或使用 Stream。
Q5: 一个客户端可以订阅多少个频道? A: 没有硬性限制,但订阅越多内存占用越高,且连接断线重连成本越大。