首页/数据/数据库速查/List 队列模式与 Stream 对比
Redis 命令96 条

List 队列模式与 Stream 对比

List 队列适合轻量任务:LPUSH/BRPOP 或 LMOVE 可靠队列;需要消费组、ACK、回溯、多播时用 Stream。

数据库速查数据更新于 2026-10-13

List 队列与 Stream 的分工

用 List 做队列的核心是 LPUSH 或 RPUSH 入队、BRPOP 或 LMOVE 出队,简洁高效但没有消费确认与重试语义;需要消费组、消息确认、按 ID 回溯、多播时应当用 Stream。选择标准是「消息丢了能不能接受」:不能接受就要么自建可靠机制,要么直接用 Stream 或专业消息队列。

对比与选型

维度List 队列Stream
消费组无,多个消费者靠竞争弹出XGROUP 原生支持消费组
消息确认无,需用 LMOVE 自建处理中队列XACK 与 PEL 提供确认与重投
回溯不支持,弹出即消失可按 ID 范围重读历史消息
内存控制靠 LTRIM 手工裁剪MAXLEN 近似裁剪
复杂度极简,几行命令即可功能完整但运维与理解成本更高
适用内部低频任务、可容忍丢失需要可靠投递或多样消费的场景

最小队列实现

最小队列实现
RPUSH q:jobs job1 job2 job3    # 生产者:尾部入队
BRPOP q:jobs 5                 # 消费者:阻塞 5 秒取出,超时返回空
LLEN q:jobs                    # 积压监控:队列长度
LMOVE q:jobs q:processing LEFT RIGHT   # 可靠队列:取出后先落到处理中队列
LREM q:processing 1 "job1"     # 处理成功后从处理中队列移除
LTRIM q:jobs 0 9999            # 用 LTRIM 控制长度,避免无限增长

典型使用场景

  • 内部低频任务分发:发邮件、生成报表等可容忍重试的场景
  • 削峰缓冲:突发写入先入队,由消费者按能力取走
  • 轻量任务队列:不想引入外部组件的单体应用
  • 可靠队列变体:用 LMOVE 移到处理中队列,崩溃后可人工回捞
  • 积压监控:用 LLEN 与耗时指标判断消费能力是否不足
并发量上千、需要确认与重试的作业系统应选 Stream 或专业 MQ:用 List 补齐这套机制往往比直接换方案代价更高。
队列键没有长度上限,生产者突发流量会把内存吃光;上线前必须明确最大积压量并配置裁剪与告警。

运维注意事项

  • 积压告警要同时看队列长度与单条处理耗时两个维度
  • 直接用 DEL 清理队列会丢任务,优先通过消费者排空或转投死信队列
  • 消费者数量与积压量要匹配,过多消费者只是空转占用连接

易错点

  • 拿 List 当 MQ 又要 ack 与重试:得自己补整套机制,成本远超预期,直接换 Stream 更省事
  • 用 BRPOP 弹出即当处理完成:进程崩溃时任务直接丢失,可靠场景要配 LMOVE 与处理中队列
  • 队列键不设长度上限也不裁剪:内存被单一队列吃光,连带影响同实例的所有业务
  • 每个 Key 一个消费者阻塞:BRPOP 是广播式阻塞,消费者数远大于积压量时大量连接空转

数据来源与参考

  • Redis 官方文档: List 使用模式
  • Redis 官方文档: Streams

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌