*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 的客户端也会收到。