Redis 发布订阅详解

50 阅读2分钟

Redis 的发布订阅(Pub/Sub)功能是 Redis 提供的一种消息通信模式,允许发送者(publisher)和接收者(subscriber)之间进行解耦合的消息传递。

基本概念

  • 发布者(Publisher):向指定频道发送消息的客户端
  • 订阅者(Subscriber):接收特定频道消息的客户端
  • 频道(Channel):消息传输的通道,类似广播电台的频率

主要命令

# 订阅频道
SUBSCRIBE channel_name

# 发布消息到频道
PUBLISH channel_name "message"

# 取消订阅
UNSUBSCRIBE channel_name

# 模式匹配订阅
PSUBSCRIBE pattern*

# 取消模式订阅
PUNSUBSCRIBE pattern*

应用场景

  1. 实时通知系统

    • 系统公告广播
    • 用户消息推送
  2. 事件驱动架构

    • 微服务间异步通信
    • 业务事件广播
  3. 实时数据更新

    • 股票价格更新
    • 游戏状态同步
  4. 日志收集与分发

    • 分布式系统的日志聚合
    • 监控告警信息传递

典型应用场景

// 示例: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 适用于对消息可靠性要求不高但对实时性要求较高的场景,是构建实时应用的重要工具。