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

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值