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

发布于:2025-06-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

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 news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "sports"
3) (integer) 1
1) "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 redis

r = redis.Redis(host='localhost', port=6379, db=0)

# 发布消息到不同频道
r.publish('sports', 'Soccer match started!')
r.publish('news', 'COVID-19 vaccine update')
订阅者(subscriber.py
import redis

r = 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 的发布订阅功能,你可以轻松实现实时消息系统和微服务间的事件通信,同时保持系统组件的松散耦合。