Redis 发布订阅(Pub/Sub)模式详解_redis subscribe
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 newsReading messages... (press Ctrl-C to quit)1) \"subscribe\"2) \"sports\"3) (integer) 11) \"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 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}\")
七、注意事项
-
消息丢失风险:
- Redis Pub/Sub 不持久化消息,若订阅者离线,消息会丢失
- 适合实时性要求高、但允许少量消息丢失的场景
-
性能考虑:
- 大量频道或高频率发布可能影响 Redis 性能
- 建议对频道进行合理分类和限流
-
替代方案:
- 若需要消息持久化和可靠传递,可考虑 Redis Streams、RabbitMQ 或 Kafka
八、常用命令汇总
SUBSCRIBE channel
PSUBSCRIBE pattern
PUBLISH channel msg
UNSUBSCRIBE channel
PUNSUBSCRIBE pattern
PUBSUB CHANNELS
PUBSUB NUMSUB
通过 Redis 的发布订阅功能,你可以轻松实现实时消息系统和微服务间的事件通信,同时保持系统组件的松散耦合。