Redis 的发布订阅(Pub/Sub)功能是 Redis 提供的一种消息通信模式,允许发送者(publisher)和接收者(subscriber)之间进行解耦合的消息传递。
基本概念
- 发布者(Publisher):向指定频道发送消息的客户端
- 订阅者(Subscriber):接收特定频道消息的客户端
- 频道(Channel):消息传输的通道,类似广播电台的频率
主要命令
# 订阅频道
SUBSCRIBE channel_name
# 发布消息到频道
PUBLISH channel_name "message"
# 取消订阅
UNSUBSCRIBE channel_name
# 模式匹配订阅
PSUBSCRIBE pattern*
# 取消模式订阅
PUNSUBSCRIBE pattern*
应用场景
-
实时通知系统
- 系统公告广播
- 用户消息推送
-
事件驱动架构
- 微服务间异步通信
- 业务事件广播
-
实时数据更新
- 股票价格更新
- 游戏状态同步
-
日志收集与分发
- 分布式系统的日志聚合
- 监控告警信息传递
典型应用场景
// 示例:Web 应用中的实时通知
// 后端服务作为发布者
redisClient.publish('user_notifications', JSON.stringify({
userId: 123,
message: '订单已发货'
}));
// 前端应用作为订阅者
const subscriber = redisClient.duplicate();
subscriber.subscribe('user_notifications');
subscriber.on('message', (channel, message) => {
// 处理接收到的通知
console.log('收到通知:', message);
});
关键特点
- 双向性:任何客户端都可以同时是发布者和订阅者
- 动态性:客户端可以随时切换角色
- 多对多:一个
channel可以有多个发布者和订阅者 - 临时性:订阅关系只在客户端连接期间有效
所以发布者和订阅者都是 Redis 客户端,具体是服务器端还是客户端应用取决于实际的业务场景。## 特点
✅ 解耦合:发布者和订阅者不需要知道彼此的存在 ✅ 实时性:消息几乎即时传递 ✅ 简单易用:API 简单直观 ✅ 支持通配符:可按模式订阅多个频道
⚠️ 无持久化:消息不存储,离线期间会丢失消息 ⚠️ 无确认机制:无法保证消息被成功接收 ⚠️ 网络分区敏感:网络不稳定可能导致消息丢失
Redis Pub/Sub 适用于对消息可靠性要求不高但对实时性要求较高的场景,是构建实时应用的重要工具。