pub sub
Redis 的 Pub/Sub(发布/订阅)是一种消息通信模式,允许消息的发布者(Publisher)将消息发送到频道(channel), 而订阅者(Subscriber)只需订阅感兴趣的频道即可接收到消息。发布者和订阅者之间是松耦合的,彼此不直接通信。
一、基本概念
- 发布者(Publisher):发送消息到某个频道。
- 订阅者(Subscriber):订阅一个或多个频道,接收该频道中发布的消息。
- 频道(Channel):逻辑上的消息传递路径,字符串类型标识。
二、常用命令
命令 | 描述 |
---|---|
SUBSCRIBE channel [channel ...] | 订阅一个或多个频道 |
UNSUBSCRIBE [channel [channel ...]] | 取消订阅频道 |
PUBLISH channel message | 向某个频道发布消息 |
PSUBSCRIBE pattern [pattern ...] | 订阅与某模式匹配的频道 |
PUNSUBSCRIBE [pattern [pattern ...]] | 取消模式匹配订阅 |
bash
PSUBSCRIBE news.* sports.*
PUNSUBSCRIBE news.* sports.*
三、示例(使用 redis-cli)
四、注意事项
- 消息不会被持久化,只有在线订阅者能收到消息。
- 不能在 Redis 的集群模式中横跨节点(a节点发布,b节点订阅)使用
SUBSCRIBE
。 - 使用
psubscribe
可支持通配符匹配频道,例如:psubscribe news.*
。 - Pub/Sub 模式适合即时通信、消息广播等场景,不适合重要数据传输(可结合 Stream 或消息队列如 RabbitMQ)。
Format of pushed messages
- message 第二个参数:channel 第三个参数:message payload
- subscribe 第一个参数:channel 第二个参数:number of subscribers
- unsubscribe 第一个参数:channel 第二个参数:number of subscribers
实际场景
聊天室中“对方正在输入” • A 开始输入,向频道 typing:user123 发布一个事件 • B 订阅这个频道,收到消息后在界面显示 “对方正在输入…”
这种消息没必要存档,实时通知即可。
游戏或实时互动提醒 • 玩家 A 发起对战,发送 PUBLISH battle.invite user456 • 玩家 B 订阅相关频道,界面立即弹出对战邀请提示
适合实时性强但不需要消息留存的场景。