PUB-SUB(发布/订阅)是 Redis 的消息通信模式,支持客户端通过频道(Channel)进行消息广播。这是一个系统概述,不是单个命令。
PUB-SUB 包含以下核心命令:
PUBLISH channel message
SUBSCRIBE channel [channel ...]
PSUBSCRIBE pattern [pattern ...]
UNSUBSCRIBE [channel [channel ...]]
PUNSUBSCRIBE [pattern [pattern ...]]
PUBSUB subcommand [argument ...]
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channel | String | 是 | 频道名称 |
| message | String | 是 | 要发布的消息内容 |
| pattern | String | 是 | 频道匹配模式(支持 glob 风格) |
| subcommand | String | 是 | PUBSUB 的子命令 |
# 客户端 A
> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
# 客户端 B
> PUBLISH news "hello world"
(integer) 1
> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
> PUBLISH news.sports "score update"
(integer) 1
> PUBSUB CHANNELS
1) "news"
2) "chat"
> PUBSUB NUMSUB news chat
1) "news"
2) (integer) 2
3) "chat"
4) (integer) 1
| 错误 | 原因 | 解决 |
|---|---|---|
| 订阅后无法执行其他命令 | 客户端进入订阅模式后只能接收消息 | 使用单独的连接进行订阅,或使用 SSUBSCRIBE(Redis 7.0+) |
| 消息丢失 | 订阅者未连接时发布消息 | 使用 Stream 或记录消息到持久化存储 |
| 模式匹配不生效 | 模式语法错误 | 检查 glob 模式语法是否正确 |
service:entity:event 格式Q1: PUB-SUB 消息持久化吗? A: 不持久化。如果没有订阅者在线,消息会丢失。需要持久化请使用 Redis Stream 或消息队列。
Q2: SUBSCRIBE 和 PSUBSCRIBE 可以同时使用吗? A: 可以,一个客户端可以同时使用 SUBSCRIBE 订阅具体频道和 PSUBSCRIBE 订阅模式。
Q3: PUB-SUB 支持集群模式吗? A: 支持,但消息只广播到目标频道所在节点的订阅者。需要使用全局频道或特定客户端处理集群模式下的广播。