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"
五、应用场景
- 实时消息系统:如聊天室、实时通知
- 分布式系统间通信:微服务间事件通知
- 实时数据推送:股票行情、实时日志收集
- 事件驱动架构:作为事件总线实现解耦
六、代码示例(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}")
七、注意事项
消息丢失风险:
- Redis Pub/Sub 不持久化消息,若订阅者离线,消息会丢失
- 适合实时性要求高、但允许少量消息丢失的场景
性能考虑:
- 大量频道或高频率发布可能影响 Redis 性能
- 建议对频道进行合理分类和限流
替代方案:
- 若需要消息持久化和可靠传递,可考虑 Redis Streams、RabbitMQ 或 Kafka
八、常用命令汇总
命令 | 描述 |
---|---|
SUBSCRIBE channel |
订阅指定频道 |
PSUBSCRIBE pattern |
订阅符合模式的频道 |
PUBLISH channel msg |
向频道发布消息 |
UNSUBSCRIBE channel |
取消订阅指定频道 |
PUNSUBSCRIBE pattern |
取消订阅符合模式的频道 |
PUBSUB CHANNELS |
查看当前活跃的频道 |
PUBSUB NUMSUB |
查看指定频道的订阅者数量 |
通过 Redis 的发布订阅功能,你可以轻松实现实时消息系统和微服务间的事件通信,同时保持系统组件的松散耦合。