欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > Redis 发布订阅(Pub/Sub)模式详解

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

2025/11/7 16:31:06 来源:https://blog.csdn.net/temp0504/article/details/148556926  浏览:    关键词:Redis 发布订阅(Pub/Sub)模式详解

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词