*Redis PUBLISH 命令
PUBLISH 向指定的频道发送消息,所有订阅该频道的客户端都会收到。
*语法
PUBLISH channel message
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channel | String | 是 | 频道名称 |
| message | String / Bytes | 是 | 要发送的消息内容 |
*返回值
- Integer:收到该消息的客户端数量
- 如果没有客户端订阅该频道,返回 0
*时间复杂度
O(N+M),N 为订阅该频道的客户端数量,M 为订阅模式匹配该频道的客户端数量(总订阅客户端数)。
*示例
*基本发布
> PUBLISH news "breaking news: new update"
(integer) 3
*无订阅者的频道
> PUBLISH emptychannel "hello"
(integer) 0
*发布结构化消息
> PUBLISH chat:room1 "{\"user\":\"alice\",\"msg\":\"hi\"}"
(integer) 5
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少 channel 或 message | 补充完整参数 |
*最佳实践
- 发布/订阅模式适合实时消息推送、广播通知、聊天室等场景
- 消息不会持久化,离线客户端收不到消息。需要持久化消息时,配合 LIST 或 STREAM 使用
- 高并发场景下,PUBLISH 是 O(N) 操作,大量订阅者可能影响性能,考虑分片或降级
- 消息体建议用 JSON 等结构化格式,便于消费端解析
*FAQ
Q1: PUBLISH 的消息能持久化吗? A: 不能。Redis Pub/Sub 不持久化消息。消息只会发送给当前在线的订阅者。需要持久化消息队列,应使用 Redis Stream 或配合 LIST 实现。
Q2: 没有订阅者的消息会丢失吗? A: 是的。如果没有客户端订阅该频道,消息直接丢弃,不会存储。返回 0 表示无接收者。
Q3: PUBLISH 支持模式匹配吗?
A: PUBLISH 本身不支持模式匹配,但 PSUBSCRIBE 可以订阅模式(如 news.*),PUBLISH 到 news.sports 时,PSUBSCRIBE 的客户端也会收到。