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

发布于:2025-06-11 ⋅ 阅读:(37) ⋅ 点赞:(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 的发布订阅功能,你可以轻松实现实时消息系统和微服务间的事件通信,同时保持系统组件的松散耦合。


网站公告

今日签到

点亮在社区的每一天
去签到