Redis 的 发布订阅(Pub/Sub)模式 是一种 消息通信模式,允许客户端通过 频道(Channel) 实现消息的 一对多广播。发送消息的客户端称为 发布者(Publisher),接收消息的客户端称为 订阅者(Subscriber),Redis 服务器充当 中间转发者,将发布者的消息实时推送给所有订阅该频道的订阅者。
一、核心原理
1. 频道(Channel):消息的分类标签
- 频道是一个 字符串标识(如
chat:news、order:update),用于对消息进行分类。 - 订阅者可以订阅一个或多个频道,发布者向指定频道发送消息,所有订阅该频道的订阅者都会收到消息(无持久化,消息仅实时推送,未在线的订阅者会丢失消息)。
2. 订阅者(Subscriber):主动监听频道
- 订阅者通过
SUBSCRIBE命令订阅频道,进入 监听状态(阻塞式等待消息)。 - 一个订阅者可以同时订阅 多个频道(如
SUBSCRIBE channel1 channel2)。 - 订阅后,Redis 会为该客户端维护一个 “订阅关系表”(记录客户端 ID 与频道的映射)。
3. 发布者(Publisher):向频道发送消息
- 发布者通过
PUBLISH channel message命令向指定频道发送消息,自身不关心订阅者是谁。 - Redis 收到消息后,会 遍历订阅该频道的所有客户端,将消息 立即推送给每个订阅者(不存储消息,即“即发即失”)。
4. 核心数据结构:订阅关系表
Redis 内部通过一个 字典(Dict) 维护订阅关系:
- Key:频道名称(如
chat:news)。 - Value:一个 集合(Set),存储订阅该频道的客户端 ID(Client ID)。
# Redis 内部订阅关系表示例
{
"chat:news": {client1001, client1002, client1003}, # 3个订阅者
"order:update": {client1001, client1004} # 2个订阅者
}
- 当发布者发送消息到
chat:news时,Redis 会遍历client1001、client1002、client1003,将消息推送给它们。
二、工作流程(步骤拆解)
Step 1:订阅者订阅频道
# 客户端 A 订阅频道 "chat:news"
127.0.0.1:6379> SUBSCRIBE chat:ne

最低0.47元/天 解锁文章
552

被折叠的 条评论
为什么被折叠?



