Yihui’s Blog

线上发现 Redis 机器爆了,如何优化?

日期:2026-07-11
标签:#面试 #八股 #后端 #Redis #线上问题排查 #场景题

一句话答案

先明确“爆了”是内存、CPU、带宽、连接还是延迟问题,立即限流、扩容和隔离热点止损,再从大 Key、热 Key、过期策略、数据结构和集群分片治理根因。

面试口语版

我先看 Redis 指标和 INFO,区分内存接近上限、CPU 满、网络带宽满、连接数过高或延迟飙升,同时确认影响范围和最近变更。内存问题重点查 big key、无 TTL、碎片率和淘汰策略;CPU 问题查慢命令、全量扫描、Lua 长脚本和热 Key;带宽问题查大 Value 和读写放大。应急可以限流、关闭非核心缓存、扩容分片、给热 Key 加本地缓存或副本。根治要拆大 Key、压缩 Value、合理 TTL 加随机抖动,并建立容量水位和热 Key 监控。

排查矩阵

症状重点证据常见处理
内存满used_memory、evicted_keys、碎片率清理无效数据、拆大 Key、扩容、设置 TTL
CPU 高slowlog、commandstats、热 Key禁止重命令、拆分/复制热点、优化 Lua
带宽满net input/output、Value 大小压缩、批量、减少大对象、扩带宽
延迟高latency doctor、fork、持久化调整持久化、避免主线程阻塞、检查磁盘

关键细节

  • 不要在线直接执行 KEYS *;使用渐进 SCAN,大实例优先离线分析 RDB。
  • 淘汰策略不是容量规划的替代品,缓存和持久化数据的处理方式不同。
  • Redis Cluster 扩容只能分散不同 Key,单个热 Key 仍需本地缓存、读副本或业务分桶。
  • Big Key 删除使用异步 UNLINK,避免主线程阻塞。

面试官追问

  1. 如何发现热 Key 和大 Key?
  2. 内存碎片率高怎么办?
  3. 缓存雪崩与击穿怎么治理?
  4. 主从切换后数据丢失怎么办?

面试官追问参考答案

1. 如何发现热 Key 和大 Key?

热 Key 可结合 commandstats、客户端采样、代理层统计和 Redis --hotkeys(需合适淘汰策略)发现;大 Key 可离线分析 RDB,或低峰使用 SCAN 配合 MEMORY USAGE/类型长度抽样。生产上避免执行阻塞式全库命令。

2. 内存碎片率高怎么办?

先区分 allocator 碎片、RSS 未归还和 fork/COW 影响。可启用并谨慎观察 active defrag,减少频繁大小变化的大对象,滚动重启或迁移分片回收 RSS;扩容前确认碎片率高是否真的造成物理内存压力。

3. 缓存雪崩与击穿怎么治理?

雪崩用 TTL 随机抖动、分批预热、多级缓存和数据库限流;击穿针对单热 Key 使用互斥重建、逻辑过期、请求合并和永不过期加主动刷新。两者都要准备缓存不可用时的降级和回源容量保护。

4. 主从切换后数据丢失怎么办?

Redis 异步复制下主节点已确认但未复制的数据可能丢失,需根据 RPO 选择 AOF、min-replicas-to-write、更可靠部署或外部持久化。缓存数据可从数据库重建;若 Redis 承载不可丢业务状态,应通过数据库/日志对账恢复,不能把普通 Redis 高可用当强一致。

学习清单

  • 熟悉 Redis 内存、CPU、网络和延迟四类指标。
  • 掌握大 Key、热 Key和缓存集中失效的治理方式。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章