Redis PubSub 是一种基于频道的消息多播机制,发布者发送消息后,所有订阅该频道的客户端都会实时收到副本。本文通过终端交互示例演示订阅、发布与接收的完整流程,汇总常用命令并说明模式匹配与状态查询方法,帮助开发者判断其适用场景与使用边界。
发布/订阅完整流程
Redis PubSub 模块又称发布/订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(发送方)将消息发送到指定 channel(频道),订阅者(接收方)接收消息。在 Redis 中,一个客户端可以订阅任意数量的 channel。
消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的一种解耦方式。
下面通过两个终端窗口演示“发布/订阅”模式的工作流程:

1) 订阅者等待接收消息
打开第一个 Redis 客户端,使用 SUBSCRIBE 命令订阅名为 www.biancheng.net 的频道:
#订阅channel 127.0.0.1:6379> SUBSCRIBE www.biancheng.net Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "www.biancheng.net" 3) (integer) 1
命令执行后,该客户端会进入等待接收消息的阻塞状态。
2) 发布者发送消息
打开第二个 Redis 客户端,使用 PUBLISH 命令向同一频道发送消息:
127.0.0.1:6379> PUBLISH www.biancheng.net "this is website" (integer) 1 127.0.0.1:6379> PUBLISH www.biancheng.net "hello world" (integer) 1 127.0.0.1:6379> PUBLISH www.biancheng.net "how are you" (integer) 1
此时两个客户端处于同一个频道,前者负责接收,后者负责发布。
3) 订阅者成功接收消息
回到第一个客户端,会看到如下输出:
127.0.0.1:6379> SUBSCRIBE www.biancheng.net Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "www.biancheng.net" 3) (integer) 1 1) "message" 2) "www.biancheng.net" 3) "this is website" 1) "message" 2) "www.biancheng.net" 3) "hello world" 1) "message" 2) "www.biancheng.net" 3) "how are you"
常用命令与参数说明
| 命令 | 说明 |
|---|---|
| PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合指定模式的频道。 |
| PUBSUB subcommand [argument [argument ...]] | 查看发布/订阅系统状态,可选参数: 1) channel 返回在线状态的频道。 2) numpat 返回指定模式的订阅者数量。 3) numsub 返回指定频道的订阅者数量。 |
| PUBLISH channel message | 将信息发送到指定的频道。 |
| PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有指定模式的频道。 |
| SUBSCRIBE channel [channel ...] | 订阅一个或者多个频道的消息。 |
| UNSUBSCRIBE [channel [channel ...]] | 退订指定的频道。 |
模式匹配与状态查询
使用 PSUBSCRIBE 可以通过通配符 * 批量订阅频道。例如 www* 会匹配所有以 www 开头的频道(如 www.baidu.com、www.biancheng.net 等)。
#订阅指定模式的频道,*代表通配符,会匹配所有www开头的频道 127.0.0.1:6379> PSUBSCRIBE www* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "www*" 3) (integer) 1 #按ctrl+c退出阻塞状态 ^C C:UsersAdministrator>redis-cli #查看发布订阅系统状态,返回相应的频道 127.0.0.1:6379> PUBSUB channels 1) "www.biancheng.net" #退订指定模式的频道 127.0.0.1:6379> PUNSUBSCRIBE www* 1) "punsubscribe" 2) "www*" 3) (integer) 0 #退订指定频道 127.0.0.1:6379> UNSUBSCRIBE www.biancheng.net 1) "unsubscribe" 2) "www.biancheng.net" 3) (integer) 0
通过 PUBSUB channels 可查看当前活跃的频道列表;PUNSUBSCRIBE 与 UNSUBSCRIBE 分别用于按模式或按频道名称退订。
适用场景与注意事项
PubSub 适合对消息可靠性要求不高、但需要低延迟广播的场景,例如实时通知、配置热更新、轻量级事件总线等。其核心特点与限制如下:
- 无持久化与回溯:消息仅在发布瞬间投递给当前在线的订阅者,未订阅或断线的客户端无法补收历史消息。
- 阻塞式连接:执行
SUBSCRIBE或PSUBSCRIBE后,客户端连接进入订阅模式,只能继续执行订阅相关命令,需通过Ctrl-C或退订命令恢复常规操作。 - 无消费确认机制:消息投递后不等待 ACK,发布者仅获知当前订阅者数量(返回值),无法确认消息是否被成功处理。
若业务需要消息持久化、顺序保证或消费确认,建议评估 Redis Stream 或 List 结构,或引入专用消息中间件。在线练习工具:https://try.redis.io/;查看更多命令:https://redis.io/commands
