我为什么单一消费者的场景下,要用 Redis List 当消息队列?

发布时间:2026/9/14 16:46:36

我为什么单一消费者的场景下,要用 Redis List 当消息队列? 我为什么单一消费者的场景下要用 Redis List 当消息队列List 做队列到底有多简单Redis List 是一个双向链表做队列只需要两个命令# 生产者入队LPUSH auto_material_tasks{task_id: 206}# 消费者阻塞出队BLPOP auto_material_tasks30没有 consumer group、没有 ACK、没有 pending、没有 offset。消息格式就一条 JSON里面只放一个task_id消费者拿到 ID 后去 MySQL 查完整数据。Redis 不存业务状态只做通知这一件事。在单一消费者的场景下List 的简单性就是它的优势。为什么不用 StreamRedis Stream 是 Redis 5.0 推出的正经 MQ 数据结构有 ACK、消费者组、pending 列表、消息回溯、断点续消费,那为什么不用因为这些功能项目里已经用MySQL实现了。来看项目实际的任务模型┌─────────────┐ LPUSH ┌──────────────┐ ClaimPendingTask ┌─────────┐ │ Producer │ ───────────────→│ Redis List │←──(KEDA 监控长度)─────│ KEDA │ └─────────────┘ └──────┬───────┘ └────┬────┘ │ BLPOP │ ▼ 扩缩容 │ ┌─────────────┐ ┌──────────────┐ │ │ Consumer │ ──── 查完整数据 →│ MySQL │←──────────────────────────────┘ └─────────────┘ └──────────────┘ACKMySQL 的 CAS 认领已经做了每个 worker 拿到的不是一个消息而是去 MySQL 执行ClaimPendingTask这条 SQL 用UPDATE ... WHERE status 0做乐观锁认领任务。谁 update 到的行数 0谁就拿了锁其他 worker 自动跳过。这本身就是 ACK 机制认领成功 确认消费不需要 Redis 再来一套 XACK。消费者组KEDA ScaledJob 一任务一进程Stream 的消费者组解决的是同一队列多个消费者如何分配消息的问题。本项目的消费者模型是 KEDA 监测 Redis List 长度动态创建 K8s Job。每个 Job 是一个独立进程跑完就销毁。不存在多进程争抢同一个队列的场景,伸缩的单位是进程不是线程。消息丢了RetryScanOnce 定时扫描兜底List 最大的硬伤是BLPOP弹出即删消费者崩了消息就没了。在项目里有个定时任务RetryScanOnce每隔一段时间就去 MySQL 扫描超时未完成的任务重新塞回队列。消息可靠性的兜底在 MySQL不在 Redis。Redis 丢消息可以容忍因为 MySQL 里的状态没丢。消息回溯 有Mysql任务表Stream 支持根据消息 ID 回溯历史消息。在项目里队列消息体就一个{task_id: 206}没有任何需要回溯的业务数据。真要排查去 MySQL 查任务表完整的状态变更历史全在那。为什么不用 MySQL 当队列轮询开销大200 个 worker 每秒SELECT ... WHERE status 0 LIMIT 1这就是 200 QPS 的空查询纯浪费。锁竞争激烈SELECT FOR UPDATE或UPDATE ... WHERE status 0并发一高 MySQL 锁竞争严重吞吐量上不去。KEDA 不认 MySQL 列表长度KEDA 原生支持监控 Redis List 长度做扩缩容MySQL 只能自己写 metrics 接口。BLPOP零浪费阻塞等有消息立刻唤醒没消息就等着零 CPU 消耗。MySQL 轮询做不到这一点。List 当通知DB 当状态机职责承担者为什么任务通知Redis List快、阻塞、零轮询任务状态MySQL事务、持久化、复杂查询可靠性兜底MySQL 定时扫描状态机不丢消息就能补弹性伸缩KEDA Redis List原生支持 List 长度监控代价是什么消息格式自己校验Redis 不关心你塞的字符串是不是合法 JSON应用层json.Unmarshal失败了就丢掉打一行 error log。没有死信队列消息处理失败没有自动重试和转存得自己写逻辑。没有消息回溯想重跑某条历史消息去 MySQL 手动改任务状态。不能广播一条消息只能被一个消费者拿走想多个服务同时收到在业务层再发一条。
延伸阅读

更多相关文章

2026/9/15 11:30:04

AIGC创作教学新风口!云桌面如何重塑校园实训模式

AIGC技术普及带动数字创作课程落地,院校与职业培训机构普遍遭遇硬件算力不足、实训环境难以统一管控、跨场景学习受限等现实阻碍。云桌面依托云端集中算力池,把AI绘图、数字视频、三维建模等高负载创作程序部署至远端服务器,普通终端设备即可…

2026/9/12 0:14:32

Java开发者转型大模型应用开发的实战指南

1. 从Java工程师到AI开发者的转型之路 三年前,我还在某互联网公司做着传统的Java后端开发,每天和Spring Boot、MySQL、Redis打交道。直到去年公司裁员,我才意识到传统开发岗位的竞争已经白热化。在失业后的三个月里,我完成了从Jav…

2026/9/10 23:10:49

智能体技术解析与开发实战:从原理到部署

1. 智能体(Agent)技术全景解析在大模型技术爆发的2023年,智能体(Agent)已成为AI落地的最重要载体。不同于传统AI系统的被动响应模式,智能体通过自主感知、决策和执行能力,正在重塑人机交互的范式。根据实际项目经验,一个典型的智能…

2026/9/15 11:27:22

Loop 让 Mac 窗口管理变成一次按键的事

Loop 让 Mac 窗口管理变成一次按键的事 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop Loop 是一款面向 macOS 的开源 Mac 窗口管理工具,把拖动窗口边框这件事压缩成一次按键加一次鼠标移动…

2026/9/15 11:27:22

EIP-658 解读:以太坊如何在交易收据中嵌入执行状态码

EIP-658 解读:以太坊如何在交易收据中嵌入执行状态码 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs 导读 EIP-658(Embedding transaction status code in receip…

2026/9/15 11:22:22

用View Transitions API优雅实现SPA路由切换动画

SPA 项目做久了,你会发现一个特别尴尬的问题:页面切换太“硬”了。点击一个菜单,内容唰一下换掉,整个过程没有任何过渡,用户经常不知道新页面从哪儿来、上一个页面去哪儿了。早年我为了解决这个问题,在 Vue…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码