讲师中心 微信公众号
AI工具推荐 视频效率加速

如何处理Redis发布订阅模式中的重复消息消费?

星墨酱_9622

星墨酱_9622

发布时间:2026-07-26 06:29:36

|

176人浏览过

|

来源于php中文网

原创

Redis Pub/Sub 会重复投递消息是因为其设计本质是无状态广播,不保证消息去重;必须由业务层用发布方生成的唯一msg_id配合SETNX+EX原子操作实现幂等校验,且需考虑Redis故障导致去重失效的风险。

如何处理redis发布订阅模式中的重复消息消费?

Redis Pub/Sub 为什么会重复投递消息

不是 Redis 出了问题,而是它根本没打算防重——PUBLISH 是纯广播,所有当前在线的 SUBSCRIBE 客户端(包括同一服务的多个进程、不同机器上的实例)都会收到完整副本。没有 offset、不存消费状态、不等 ACK。网络抖动导致重连后,也会重新收到已发消息。

常见误判场景:

  • 一个订单服务部署 3 个实例,监听 order.pay → 每条支付消息被投递 3 次
  • 用 PSUBSCRIBE order.* 认为能“去重” → 实际只是扩大匹配范围,每个匹配到的客户端仍各收一份
  • 以为靠时间戳或自增 ID 当 msg_id → 易冲突,无法保证全局唯一

必须在业务层用 SETNX+EX 做幂等校验

Redis Pub/Sub 本身不提供去重能力,任何试图调整订阅逻辑、换命令、改配置的做法都无效。唯一可靠路径:发布方生成唯一 msg_id,消费者用 SET key value NX EX seconds 原子判断是否已处理。

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

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

下载
  • msg_id 必须由发布方生成并透传,推荐 uuid4() 或 Snowflake ID,不能拼接时间戳或用 Redis 自增
  • key 命名建议统一前缀,例如 seen:order:{msg_id},避免跨业务冲突
  • 必须用单条原子命令:redis_client.set(f"seen:{msg_id}", "1", nx=True, ex=3600),分开 SETNX + EXPIRE 会并发漏判
  • 校验失败必须直接 return,不要抛异常、不重试、不模拟 ACK —— Pub/Sub 本就不支持这些语义

Redis 故障会导致幂等失效,这点最容易被忽略

用 Redis 存 seen:{msg_id} 是轻量方案,但最大隐患不是性能,而是数据“意外丢失”:单点重启、主从切换、集群 slot 迁移,都可能让去重标记消失,从而引发误重放。

  • 若业务对“绝对不重复”要求极高(如支付扣款),仅靠 SET 不够,需叠加 DB 去重表或带持久化的分布式锁服务
  • 用 Redis Cluster 时,必须确保 seen:{msg_id} 的 key 落在同一 slot,否则跨节点查询失败 → 推荐写成 seen:order:{msg_id},用 {} 强制哈希路由
  • 过期时间设为 1 小时到 24 小时较稳妥:太短(如 5 分钟)可能因处理延迟导致误重放;太长(如 7 天)则内存占用不可控

别把分布式锁当幂等替代方案

有人用 setIfAbsent(taskId, "1", 300, TimeUnit.SECONDS) 加锁再执行,看似可行,实则埋坑:

  • 锁过期后第二个实例仍可能进业务逻辑 → 本质还是没解决“是否已执行过”的判断
  • 锁释放时机难把握:提前删锁 → 并发风险;不删锁 → 内存泄漏或阻塞后续消息
  • 真正要防的是“同一条消息被多次执行”,不是“多个消息并发执行”,所以重点不在互斥,而在“判重”

真正难的不是写出那几行 SET,而是想清楚:你的业务能容忍多少次 Redis 故障引发的误重放,以及是否值得为它上更重的方案。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

4449

2023.11.02

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

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

3995

2023.11.14

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

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

7352

2024.04.02

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

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

643

2024.04.07

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

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

756

2024.04.07

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

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

7182

2024.04.07

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

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

1160

2024.04.07

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

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

1076

2024.04.07

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn