为什么Redis订阅者无法接收离线期间的消息_理解Pub/Sub的即发即弃机制

风浩姑娘_5191

风浩姑娘_5191

2026-06-18

408人浏览

原创

redis subscribe无法接收离线消息是设计使然,因其本质为纯内存广播机制,不持久化、不维护消费位点、不缓存历史消息,断连后重连仅接收新消息。

为什么redis订阅者无法接收离线期间的消息_理解pub/sub的即发即弃机制

Redis 的 SUBSCRIBE 无法接收离线消息,不是配置或代码写错了,而是设计如此 —— 它压根不存消息。

Pub/Sub 本质是内存广播,不是消息队列

发布者调用 PUBLISH,Redis 立刻把消息拷贝给所有当前在线的订阅者连接,然后丢弃。整个过程不写磁盘、不维护消费位点、不记录谁在线谁掉线。

  • 客户端断开(网络抖动、进程重启、切后台),SUBSCRIBE 连接就断了,Redis 不会缓存任何东西等它回来
  • 重连后执行 SUBSCRIBE news,只是重新加入“未来消息”的广播名单,历史消息早已蒸发
  • PUBLISH 返回值为 0 就代表:此刻没有活跃订阅者,这条消息彻底消失

常见误判场景和验证方式

很多问题表面是“收不到”,实际是机制误解。先用 redis-cli 快速确认行为是否符合预期:

  • 终端 A 执行 SUBSCRIBE order.status → 进入阻塞监听
  • 终端 B 执行 PUBLISH order.status "paid" → 终端 A 立刻输出
  • 此时 Ctrl+C 终止终端 A,再启动新终端 A’ 执行同样 SUBSCRIBE,之前那条 "paid" 永远不会出现

如果这步复现失败(比如新订阅者收到了旧消息),说明你连的不是纯 Pub/Sub,而是混用了 Stream 或其他中间层封装。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载

哪些场景下你以为需要“离线消息”,其实不该用 Pub/Sub

只要业务要求“不能丢”“要补发”“需按序处理”,SUBSCRIBE 就不是解法,强行加重试或本地缓存只会掩盖问题:

  • 外卖订单状态变更(支付→出餐→配送):漏一条就导致骑手没单可送
  • 客服系统用户消息:用户切后台 2 分钟,回来发现没收到新咨询
  • 后台任务触发(如定时结算):服务重启期间的 PUBLISH 全部丢失,无人感知

这些必须换用 Stream(XADD/XREAD)或外部 MQ;Pub/Sub 只能当“实时扩音器”,负责把刚发生的事件吼给所有还在线的人听。

真正想保留离线消息,得绕开 SUBSCRIBE 自己管存储

没有银弹,但有明确路径:用 Stream 存消息,用 Pub/Sub 做轻量通知。

  • 发布端:先 XADD order_stream * status "paid" 写入流,再 PUBLISH order.notify "new" 广播“有新消息”
  • 订阅端:连接后先 XREAD COUNT 10 STREAMS order_stream $ 拉取未读,再 SUBSCRIBE order.notify 监听后续实时通知
  • 关键点:Stream 的消费者组(XGROUP)才能保证每条消息至少被一个实例处理;单纯 XREAD 无组名=自己维护 offset,容易重复或跳过

最易忽略的是:Pub/Sub 的频道名大小写敏感、不支持通配符匹配历史数据、也没有 TTL 控制——它连“临时存一秒”都不做。接受这点,才能不把时间浪费在给广播机制加“持久化补丁”上。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4289

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3775

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6832

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6442

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5758

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 入门教程
RabbitMQ 入门教程

共0课时 | 131人学习

RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

PHP入门到实战消息队列RabbitMQ
PHP入门到实战消息队列RabbitMQ

共22课时 | 2万人学习