694 字
3 分钟
Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?本文
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Pipeline 让客户端连续发送多条命令,再集中读取响应,减少逐条等待网络往返的时间与调用开销。它是传输与调用优化,不会把多条命令自动变成事务,也不保证整个批次不被其他客户端穿插。

一百次 GET 为什么可以更快?#

逐条发送时,每次都要等上一条返回后再发下一条。若网络 RTT 为 2 毫秒,忽略其他成本的一百次串行访问仅往返等待就约 200 毫秒。Pipeline 把多次等待重叠起来,Redis 仍执行一百条命令,但不必为每条都单独等待一次往返。这是示意估算,实际还受带宽、排队和客户端实现影响。

Pipeline 并不会天然减少命令数量。相同语义下,MGET、MSET 等原生批量命令有时更合适;Cluster 场景需满足槽位规则,或由客户端按节点拆分。若后一个操作依赖前一个响应,不能简单把逻辑直接打包,需要分阶段,或将条件判断放进短 Lua 脚本。

和事务、Lua 有什么不同?#

方式主要用途原子性边界
Pipeline减少调用往返无整批原子性
MULTI/EXEC排队后连续执行不被其他客户端命令穿插,不支持传统回滚
Lua服务端执行条件与组合操作执行不被普通命令穿插,不代表错误后回滚

批次为什么不能无限大?#

Redis 与客户端需要缓存请求和响应,超大批次会增加内存、尾延迟及连接独占时间。一个包含大 Value 的批次也会消耗大量网络带宽。应按命令数量、响应总字节量和超时目标设上限,而不是只追求吞吐数字。

常见追问#

Pipeline 中一条命令错误,后面的还执行吗?#

一般仍按收到的命令处理,各命令有各自响应;客户端要逐条检查错误,不能只看批次是否成功返回。

网络断开后能把整个 Pipeline 重发吗?#

结果可能不确定,部分命令已经执行。对于 INCR 等非幂等操作,直接重发可能重复生效,需要业务幂等或确认机制。

Pipeline 能让 Redis 并行执行命令吗?#

它不改变 Redis 6/7 核心命令的常见串行执行模型;多个 Cluster 节点可各自处理分片,但那来自分片架构。

什么情况下不该使用很大的 Pipeline?#

低延迟单请求、强依赖链、巨大响应和实例内存紧张时,应采用小批次或其他合适方案,避免影响其他请求。

Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
https://blog.xqcherry.top/posts/interview/redis/redis-pipeline/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0