<返回目录     Powered by claud/xia兄

第11课: 发布订阅

Pub/Sub消息模式

课程简介

本课程将深入讲解发布订阅的核心概念和实践应用。主要内容包括:PUBLISH、SUBSCRIBE、PSUBSCRIBE、消息队列。

核心知识点

详细内容

Redis的发布订阅是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握发布订阅的使用技巧。

一、发布订阅基础

1. 基本概念

Redis的发布订阅(Pub/Sub)是一种消息通信模式:

2. 工作原理

发布订阅的工作流程:

  1. 订阅者通过SUBSCRIBE命令订阅一个或多个频道
  2. 发布者通过PUBLISH命令向指定频道发送消息
  3. Redis服务器将消息分发给所有订阅了对应频道的订阅者
  4. 订阅者接收并处理消息

二、基本操作命令

1. PUBLISH - 发布消息

# 向指定频道发布消息
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"

2. SUBSCRIBE - 订阅频道

# 订阅一个或多个频道
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

3. UNSUBSCRIBE - 取消订阅

# 取消订阅一个或多个频道
UNSUBSCRIBE [channel [channel ...]]

# 示例:取消订阅news频道
UNSUBSCRIBE news
# 返回:
# 1) "unsubscribe"
# 2) "news"
# 3) (integer) 2  # 表示还订阅了2个频道

# 示例:取消订阅所有频道
UNSUBSCRIBE
# 返回:
# 1) "unsubscribe"
# 2) (nil)
# 3) (integer) 0  # 表示已取消所有订阅

4. PSUBSCRIBE - 模式订阅

# 订阅匹配模式的频道
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:*

5. PUNSUBSCRIBE - 取消模式订阅

# 取消订阅匹配模式的频道
PUNSUBSCRIBE [pattern [pattern ...]]

# 示例:取消订阅user:*模式
PUNSUBSCRIBE user:*

# 示例:取消订阅所有模式
PUNSUBSCRIBE

# 返回格式类似UNSUBSCRIBE

三、实际应用场景

1. 实时消息通知

# 场景描述:系统需要向用户发送实时通知

# 发布者(服务器):
PUBLISH notification:user:1001 "您有一条新消息"
PUBLISH notification:user:1001 "您的订单已发货"

# 订阅者(客户端):
SUBSCRIBE notification:user:1001

# 实际应用:
# - 网站实时通知
# - 移动端推送消息
# - 系统告警通知

2. 事件驱动架构

# 场景描述:系统各组件通过事件进行通信

# 发布事件:
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

# 实际应用:
# - 微服务架构中的服务间通信
# - 分布式系统中的事件同步
# - 业务流程的异步处理

3. 实时数据更新

# 场景描述:前端需要实时获取数据更新

# 发布数据更新:
PUBLISH data:stock:updated "{\"symbol\": \"AAPL\", \"price\": 180.25}"
PUBLISH data:weather:updated "{\"city\": \"Beijing\", \"temperature\": 25}"

# 前端订阅:
SUBSCRIBE data:stock:updated data:weather:updated

# 实际应用:
# - 实时股票行情
# - 实时天气数据
# - 实时监控数据
# - 多人协作编辑

4. 日志收集

# 场景描述:集中收集和处理分布式系统的日志

# 发布日志:
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   # 只订阅警告日志

# 实际应用:
# - 分布式系统日志收集
# - 监控告警系统
# - 审计日志处理

5. 消息队列(简单实现)

# 场景描述:实现简单的消息队列功能

# 发布消息:
PUBLISH queue:tasks "Task 1: process data"
PUBLISH queue:tasks "Task 2: send email"

# 订阅消息(消费者):
SUBSCRIBE queue:tasks

# 实际应用:
# - 任务分发
# - 异步处理
# - 流量削峰

# 注意:Redis的Pub/Sub不保证消息持久化,适合不需要严格可靠性的场景
# 对于需要可靠消息队列的场景,建议使用Redis的List实现或专业的消息队列系统

四、性能优化与最佳实践

1. 性能优化建议

2. 常见问题与解决方案

3. 安全考虑

五、与其他消息系统的对比

特性 Redis Pub/Sub Redis List(消息队列) 专业消息队列(如RabbitMQ)
消息持久化
消息确认
消息路由 简单(频道) 简单(队列) 复杂(交换机、绑定)
性能
复杂度
适用场景 实时通知、事件广播 任务队列、消息持久化 复杂业务流程、高可靠性要求

命令参考

命令 功能说明 使用场景
PUBLISH 向指定频道发布消息 发布系统通知、事件广播
SUBSCRIBE 订阅一个或多个频道 接收特定频道的消息
UNSUBSCRIBE 取消订阅频道 停止接收特定频道的消息
PSUBSCRIBE 订阅匹配模式的频道 接收一类频道的消息
PUNSUBSCRIBE 取消订阅匹配模式的频道 停止接收一类频道的消息
PUBSUB CHANNELS 列出所有活跃的频道 监控系统状态
PUBSUB NUMSUB 查看频道的订阅者数量 监控频道活跃度
PUBSUB NUMPAT 查看模式订阅的数量 监控系统状态
重要提示:

性能优化建议

实践练习

练习任务:
  1. 基础操作:打开两个redis-cli窗口,一个作为发布者,一个作为订阅者,测试基本的发布订阅功能
  2. 模式订阅:使用PSUBSCRIBE命令订阅多个匹配模式的频道
  3. 实时通知:实现一个简单的实时通知系统,支持向特定用户发送通知
  4. 事件驱动:模拟一个电商系统的事件流,包括用户注册、订单创建、支付完成等事件
  5. 日志收集:实现一个简单的日志收集系统,使用不同级别的频道存储日志
  6. 频道管理:使用PUBSUB命令查看活跃频道和订阅者数量
  7. 性能测试:测试不同消息大小和订阅者数量对性能的影响
  8. 消息队列:使用Pub/Sub实现一个简单的消息队列,并与使用List实现的队列进行对比

总结

通过本课程的学习,你已经掌握了Redis发布订阅的核心概念和使用方法:

Redis的发布订阅是一种轻量级的消息通信模式,非常适合实时通知、事件广播等场景。虽然它不保证消息的持久化和可靠传递,但在对可靠性要求不高的场景中,其简单性和高性能是一大优势。对于需要可靠消息传递的场景,建议使用Redis的List实现消息队列或专业的消息队列系统。继续深入学习和实践,你将能够更好地运用发布订阅功能构建实时、高效的应用系统。