> 技术文档 > Redis 发布订阅(Pub/Sub)模式详解_redis subscribe

Redis 发布订阅(Pub/Sub)模式详解_redis subscribe


Redis 发布订阅(Pub/Sub)模式详解

Redis 发布订阅(Publish/Subscribe)是一种消息传递模式,允许发送者(发布者)和接收者(订阅者)通过消息通道进行解耦通信。以下是其核心概念和使用方法:

一、基本概念

  • 发布者(Publisher):发送消息的客户端,不直接向特定订阅者发送消息。
  • 订阅者(Subscriber):接收消息的客户端,需预先订阅感兴趣的频道
  • 频道(Channel):消息的逻辑分类,发布者和订阅者通过频道进行关联。

特点

  • 发布者和订阅者无需知道彼此的存在
  • 支持一对多通信(一个发布者,多个订阅者)
  • 消息不持久化(若无人订阅,消息会丢失)

二、基本命令

1. 订阅频道
SUBSCRIBE channel1 channel2 ... # 订阅一个或多个频道
2. 发布消息
PUBLISH channel \"message\" # 向指定频道发布消息
3. 模式订阅(Pattern Subscription)
PSUBSCRIBE news.* # 订阅所有以 \"news.\" 开头的频道

三、示例演示

1. 启动 Redis 容器
docker run -d --name redis -p 6379:6379 redis:latest
2. 订阅频道(终端 1)
redis-cli SUBSCRIBE sports newsReading messages... (press Ctrl-C to quit)1) \"subscribe\"2) \"sports\"3) (integer) 11) \"subscribe\"2) \"news\"3) (integer) 2
3. 发布消息(终端 2)
redis-cli PUBLISH sports \"Lakers win!\"(integer) 1 # 表示有 1 个订阅者收到消息redis-cli PUBLISH news \"Breaking news: ...\"(integer) 1
4. 查看订阅者输出(终端 1)
1) \"message\"2) \"sports\"3) \"Lakers win!\"1) \"message\"2) \"news\"3) \"Breaking news: ...\"

四、模式订阅示例

1. 订阅模式(终端 1)
redis-cli PSUBSCRIBE \"news.*\"
2. 发布消息(终端 2)
redis-cli PUBLISH news.sports \"Basketball finals today\"redis-cli PUBLISH news.tech \"New iPhone released\"
3. 查看订阅者输出(终端 1)
1) \"pmessage\"2) \"news.*\"3) \"news.sports\"4) \"Basketball finals today\"1) \"pmessage\"2) \"news.*\"3) \"news.tech\"4) \"New iPhone released\"

五、应用场景

  1. 实时消息系统:如聊天室、实时通知
  2. 分布式系统间通信:微服务间事件通知
  3. 实时数据推送:股票行情、实时日志收集
  4. 事件驱动架构:作为事件总线实现解耦

六、代码示例(Python)

发布者(publisher.py)
import redisr = redis.Redis(host=\'localhost\', port=6379, db=0)# 发布消息到不同频道r.publish(\'sports\', \'Soccer match started!\')r.publish(\'news\', \'COVID-19 vaccine update\')
订阅者(subscriber.py)
import redisr = redis.Redis(host=\'localhost\', port=6379, db=0)p = r.pubsub()p.subscribe(\'sports\', \'news\') # 订阅多个频道for message in p.listen(): if message[\'type\'] == \'message\': channel = message[\'channel\'].decode(\'utf-8\') data = message[\'data\'].decode(\'utf-8\') print(f\"Received on channel \'{channel}\': {data}\")

七、注意事项

  1. 消息丢失风险

    • Redis Pub/Sub 不持久化消息,若订阅者离线,消息会丢失
    • 适合实时性要求高、但允许少量消息丢失的场景
  2. 性能考虑

    • 大量频道或高频率发布可能影响 Redis 性能
    • 建议对频道进行合理分类和限流
  3. 替代方案

    • 若需要消息持久化和可靠传递,可考虑 Redis Streams、RabbitMQ 或 Kafka

八、常用命令汇总

命令 描述 SUBSCRIBE channel 订阅指定频道 PSUBSCRIBE pattern 订阅符合模式的频道 PUBLISH channel msg 向频道发布消息 UNSUBSCRIBE channel 取消订阅指定频道 PUNSUBSCRIBE pattern 取消订阅符合模式的频道 PUBSUB CHANNELS 查看当前活跃的频道 PUBSUB NUMSUB 查看指定频道的订阅者数量

通过 Redis 的发布订阅功能,你可以轻松实现实时消息系统和微服务间的事件通信,同时保持系统组件的松散耦合。