Pub/Sub消息模式
本课程将深入讲解发布订阅的核心概念和实践应用。主要内容包括:PUBLISH、SUBSCRIBE、PSUBSCRIBE、消息队列。
Redis的发布订阅是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握发布订阅的使用技巧。
Redis的发布订阅(Pub/Sub)是一种消息通信模式:
发布订阅的工作流程:
# 向指定频道发布消息
PUBLISH channel message
# 示例:向news频道发布消息
PUBLISH news "Breaking news: Redis 7.0 released!"
# 返回: (integer) 2 # 表示有2个订阅者接收到消息
# 示例:向多个频道发布不同类型的消息
PUBLISH user:register "User 1001 registered"
PUBLISH order:created "Order 2001 created"
PUBLISH log:error "Database connection failed"
# 实际应用:发布系统通知
PUBLISH notification:system "System maintenance at 23:00"
# 实际应用:发布用户事件
PUBLISH user:1001:events "User logged in"
# 订阅一个或多个频道
SUBSCRIBE channel [channel ...]
# 示例:订阅news频道
SUBSCRIBE news
# 返回:
# 1) "subscribe"
# 2) "news"
# 3) (integer) 1
# 示例:订阅多个频道
SUBSCRIBE news sports weather
# 返回:
# 1) "subscribe"
# 2) "news"
# 3) (integer) 1
# 1) "subscribe"
# 2) "sports"
# 3) (integer) 2
# 1) "subscribe"
# 2) "weather"
# 3) (integer) 3
# 当有消息发布到订阅的频道时,会收到消息:
# 1) "message"
# 2) "news"
# 3) "Breaking news: Redis 7.0 released!"
# 实际应用:订阅系统通知
SUBSCRIBE notification:system
# 实际应用:订阅用户事件
SUBSCRIBE user:1001:events
# 取消订阅一个或多个频道
UNSUBSCRIBE [channel [channel ...]]
# 示例:取消订阅news频道
UNSUBSCRIBE news
# 返回:
# 1) "unsubscribe"
# 2) "news"
# 3) (integer) 2 # 表示还订阅了2个频道
# 示例:取消订阅所有频道
UNSUBSCRIBE
# 返回:
# 1) "unsubscribe"
# 2) (nil)
# 3) (integer) 0 # 表示已取消所有订阅
# 订阅匹配模式的频道
PSUBSCRIBE pattern [pattern ...]
# 支持的通配符:
# * - 匹配任意多个字符
# ? - 匹配单个字符
# [] - 匹配指定范围内的字符
# 示例:订阅所有以user开头的频道
PSUBSCRIBE user:*
# 会匹配 user:register, user:login, user:1001:events 等
# 示例:订阅所有log相关的频道
PSUBSCRIBE log:*
# 示例:订阅多个模式
PSUBSCRIBE news:* sports:*
# 当有消息发布到匹配的频道时,会收到消息:
# 1) "pmessage"
# 2) "user:*"
# 3) "user:register"
# 4) "User 1001 registered"
# 实际应用:订阅所有用户事件
PSUBSCRIBE user:*:events
# 实际应用:订阅所有错误日志
PSUBSCRIBE log:error:*
# 取消订阅匹配模式的频道
PUNSUBSCRIBE [pattern [pattern ...]]
# 示例:取消订阅user:*模式
PUNSUBSCRIBE user:*
# 示例:取消订阅所有模式
PUNSUBSCRIBE
# 返回格式类似UNSUBSCRIBE
# 场景描述:系统需要向用户发送实时通知
# 发布者(服务器):
PUBLISH notification:user:1001 "您有一条新消息"
PUBLISH notification:user:1001 "您的订单已发货"
# 订阅者(客户端):
SUBSCRIBE notification:user:1001
# 实际应用:
# - 网站实时通知
# - 移动端推送消息
# - 系统告警通知
# 场景描述:系统各组件通过事件进行通信
# 发布事件:
PUBLISH event:user:registered "{\"user_id\": 1001, \"timestamp\": 1707024000}"
PUBLISH event:order:created "{\"order_id\": 2001, \"user_id\": 1001}"
PUBLISH event:payment:completed "{\"payment_id\": 3001, \"order_id\": 2001}"
# 订阅事件:
# 邮件服务
SUBSCRIBE event:user:registered
# 库存服务
SUBSCRIBE event:order:created
# 物流服务
SUBSCRIBE event:payment:completed
# 实际应用:
# - 微服务架构中的服务间通信
# - 分布式系统中的事件同步
# - 业务流程的异步处理
# 场景描述:前端需要实时获取数据更新
# 发布数据更新:
PUBLISH data:stock:updated "{\"symbol\": \"AAPL\", \"price\": 180.25}"
PUBLISH data:weather:updated "{\"city\": \"Beijing\", \"temperature\": 25}"
# 前端订阅:
SUBSCRIBE data:stock:updated data:weather:updated
# 实际应用:
# - 实时股票行情
# - 实时天气数据
# - 实时监控数据
# - 多人协作编辑
# 场景描述:集中收集和处理分布式系统的日志
# 发布日志:
PUBLISH log:server1:info "Server 1 started"
PUBLISH log:server2:warn "Disk usage high: 85%"
PUBLISH log:server3:error "Database connection failed"
# 订阅日志:
# 日志收集服务
PSUBSCRIBE log:*:error # 只订阅错误日志
PSUBSCRIBE log:*:warn # 只订阅警告日志
# 实际应用:
# - 分布式系统日志收集
# - 监控告警系统
# - 审计日志处理
# 场景描述:实现简单的消息队列功能
# 发布消息:
PUBLISH queue:tasks "Task 1: process data"
PUBLISH queue:tasks "Task 2: send email"
# 订阅消息(消费者):
SUBSCRIBE queue:tasks
# 实际应用:
# - 任务分发
# - 异步处理
# - 流量削峰
# 注意:Redis的Pub/Sub不保证消息持久化,适合不需要严格可靠性的场景
# 对于需要可靠消息队列的场景,建议使用Redis的List实现或专业的消息队列系统
| 特性 | Redis Pub/Sub | Redis List(消息队列) | 专业消息队列(如RabbitMQ) |
|---|---|---|---|
| 消息持久化 | 否 | 是 | 是 |
| 消息确认 | 否 | 否 | 是 |
| 消息路由 | 简单(频道) | 简单(队列) | 复杂(交换机、绑定) |
| 性能 | 高 | 中 | 中 |
| 复杂度 | 低 | 低 | 高 |
| 适用场景 | 实时通知、事件广播 | 任务队列、消息持久化 | 复杂业务流程、高可靠性要求 |
| 命令 | 功能说明 | 使用场景 |
|---|---|---|
| PUBLISH | 向指定频道发布消息 | 发布系统通知、事件广播 |
| SUBSCRIBE | 订阅一个或多个频道 | 接收特定频道的消息 |
| UNSUBSCRIBE | 取消订阅频道 | 停止接收特定频道的消息 |
| PSUBSCRIBE | 订阅匹配模式的频道 | 接收一类频道的消息 |
| PUNSUBSCRIBE | 取消订阅匹配模式的频道 | 停止接收一类频道的消息 |
| PUBSUB CHANNELS | 列出所有活跃的频道 | 监控系统状态 |
| PUBSUB NUMSUB | 查看频道的订阅者数量 | 监控频道活跃度 |
| PUBSUB NUMPAT | 查看模式订阅的数量 | 监控系统状态 |
通过本课程的学习,你已经掌握了Redis发布订阅的核心概念和使用方法:
Redis的发布订阅是一种轻量级的消息通信模式,非常适合实时通知、事件广播等场景。虽然它不保证消息的持久化和可靠传递,但在对可靠性要求不高的场景中,其简单性和高性能是一大优势。对于需要可靠消息传递的场景,建议使用Redis的List实现消息队列或专业的消息队列系统。继续深入学习和实践,你将能够更好地运用发布订阅功能构建实时、高效的应用系统。