← 返回题目列表

Redis 慢查询和延迟抖动如何排查?

高频 中等 第 10 / 36 题 更新于 2026/07/29
Redis慢查询延迟排障

简化版

Redis 慢查询排查要先区分命令执行慢、网络慢、客户端慢还是系统抖动。常用 SLOWLOGLATENCY DOCTORINFOMONITOR 谨慎使用、bigkeys/hotkeys、CPU 和网络监控,重点看 BigKey、阻塞命令、Lua、持久化 fork、AOF fsync、内存碎片和客户端连接池。

详细版

排查 Redis 延迟不要只看一个 slowlog。SLOWLOG 记录的是命令执行时间,不包含客户端排队、网络传输和响应读取时间。客户端看到 200 ms,不代表 Redis 命令执行了 200 ms。

常见排查路径:

  • 客户端侧确认超时、连接池等待、序列化耗时。
  • Redis 侧看 slowlog、commandstats、latency。
  • 数据侧查 BigKey、热 Key、阻塞命令。
  • 系统侧看 CPU、内存、swap、网卡、磁盘。
  • 持久化侧看 RDB/AOF rewrite、fsync 抖动。

面试重点是分层定位,而不是背一串命令。

完整版教学

一、先拆“慢”发生在哪一层

一次 Redis 请求的耗时包括客户端排队、网络发送、Redis 排队、命令执行、响应写回、客户端反序列化。任何一层慢,业务都感知慢。

客户端连接池 -> 网络 -> Redis 事件循环 -> 命令执行 -> 网络返回 -> 客户端处理

SLOWLOG 只覆盖命令执行阶段,不覆盖网络和客户端。因此排查时要先问:是 Redis 自己执行慢,还是链路慢?

记忆钩子:slowlog 只看“厨师炒菜时间”,不看排队、上菜和吃饭时间。

二、SLOWLOG 怎么用

SLOWLOG GET 可以查看超过阈值的慢命令,阈值由 slowlog-log-slower-than 控制,单位是微秒。它适合发现大范围查询、慢 Lua、大 key 操作等。

SLOWLOG GET 10
CONFIG GET slowlog-log-slower-than
CONFIG GET slowlog-max-len

如果业务超时很多,但 slowlog 很干净,说明问题可能在网络、客户端连接池、Redis 排队或系统抖动,不应继续只盯慢命令。

三、LATENCY 系列看延迟事件

Redis 的 latency 监控能记录一些事件,比如 fork、command、aof-fsync、expire-cycle 等。LATENCY DOCTOR 会给出诊断建议。

LATENCY LATEST
LATENCY HISTORY command
LATENCY DOCTOR

比如看到 fork 事件尖刺,就要联想到 RDB、AOF rewrite 和写时复制;看到 aof-fsync-always 或 fsync 相关事件,就要检查磁盘和 AOF 策略。

四、BigKey 和阻塞命令怎么定位

BigKey 会让本来简单的命令变慢。比如删除一个百万元素 Set、返回一个 10 MB String,都可能阻塞事件循环或拖慢网络。

常见危险命令包括 KEYS *、大范围 HGETALL、大范围 LRANGE、复杂 SORT、长时间 Lua 脚本。可以用 redis-cli --bigkeys 辅助扫描,但线上要注意扫描成本。

命令风险
KEYS全库遍历阻塞
HGETALL 大 Hash返回和序列化巨大
DEL 大 Key同步释放慢
Lua 长脚本主线程长时间占用

五、客户端连接池也会制造“Redis 慢”

很多线上慢请求不是 Redis 慢,而是客户端连接池耗尽。比如连接池只有 20 个连接,瞬时 500 个并发请求,很多请求在应用内排队,最后看起来像 Redis 超时。

假设单次 Redis 调用平均 5 ms,20 个连接理论每秒处理约 4000 次。如果流量突然到 10000 QPS,连接池排队会快速累积。

连接池等待时间 + Redis 执行时间 + 网络时间 = 业务感知耗时

因此要看客户端指标:borrow wait、active connection、timeout、重试次数。

六、持久化和 fork 抖动

Redis 做 RDB 或 AOF rewrite 时会 fork 子进程。fork 本身和后续写时复制都可能带来延迟和内存压力,实例越大越明显。

如果此时写入很多,父进程修改页面会触发 COW,内存峰值上升。磁盘 fsync 抖动也可能让 AOF 相关延迟升高。

现象可能原因
周期性尖刺RDB/AOF rewrite
内存突然升高fork COW
写入延迟抖动AOF fsync 或磁盘忙

七、形成一套排查流程

面试里可以把排查流程讲成闭环,而不是零散命令。

确认客户端耗时分布
   |
查 slowlog 和 latency
   |
查 commandstats / bigkey / hotkey
   |
查 CPU、内存、swap、磁盘、网络
   |
定位根因并做限流、拆 key、改命令、调持久化或扩容

如果是 HGETALL 大 Hash 慢,优化是拆 key 或改分页读取;如果是连接池排队,优化是连接池和调用方式;如果是 fork 抖动,优化是持久化策略、实例拆分或低峰执行 rewrite。

八、常见误区与追问

  • 误区:业务 Redis 超时就一定能在 slowlog 里看到。 slowlog 不包含网络、排队和客户端处理时间。
  • 误区:MONITOR 很适合线上长期开启。 MONITOR 输出量巨大,可能反过来影响性能。
  • 误区:删除大 Key 用 DEL 没问题。 大 Key 同步释放可能阻塞,应考虑 UNLINK 或分批删除。
  • 追问:LATENCY DOCTOR 有什么用? 它能提示 fork、command、fsync 等延迟事件,辅助定位尖刺来源。
  • 追问:slowlog 阈值怎么设? 要结合业务延迟目标,过高漏问题,过低噪声大,可按微秒级逐步调整。
  • 追问:怎么区分服务端慢和客户端慢? 对比客户端分段耗时、slowlog、网络 RTT、连接池等待和 Redis 内部指标。

九、加强记忆

记住“慢不等于 slowlog,超时不等于 Redis 执行慢”。排查一定要分客户端、网络、Redis 命令、系统资源、持久化五层。

答题时用流程图表达,比堆命令更像真实排障经验:先定位层次,再找根因,最后给治理动作。