线上发现 Redis 机器爆了,如何优化?
- 标签:后端、场景题
🏛 业务架构师
线上 Redis 机器故障(内存/带宽/CPU 打满),我的处置按止血→定位→根治,全程以业务优先级为纲:
第一步:定性(1 分钟内)
- 监控看是内存、CPU、网络带宽哪个维度爆——三种根因完全不同;
- 看是单实例还是集群性的:单实例(热点/大 key 问题)vs 全集群(流量暴涨/批量过期)。
第二步:止血(保业务)
- 主从切换/故障转移:哨兵或云托管自动切,手动兜底;
- 非核心使用方降级:统计、通知类应用先断开或限流——牺牲非核心保核心;
- 核心读走本地缓存快照(如有)或 DB 限流读;
- 带宽打满:扩带宽/升配、限流上游写。
第三步:定位优化(按最常见根因排)
- 热点 key:单分片 CPU 独高——本地缓存 L1 + key 打散多副本;
- bigkey:
--bigkeys扫描——拆分、UNLINK 异步删; - 慢命令:slowlog 查——keys */大集合操作,改 scan 分页;
- 持久化拖累:fork 停顿 + 磁盘 IO 抢占——错峰、关不必要持久化;
- 容量真不够:业务自然增长——垂直升配快速、水平拆实例根治(按业务拆比集群化更省心);
- 网络流量:大 value 压缩、减少全量拉取(改增量/字段级)。
根治与预防机制:
- 水位告警前移:内存 70%、带宽 60%、CPU 60% 预警;
- 周期巡检(bigkey/热点/慢查询)制度化;
- 大促容量预案:活动前压测 + 提前扩容——把"线上爆了"变成"事前算了"。
一句话:Redis 爆机的优化主轴是**"先切流保业务,再按数据找根因"**——八成故障根因在使用方式(热点、大 key、慢命令),两成才是容量。
🏗 系统架构师
"Redis 机器爆了"我按止血 → 定位 → 治理 → 预防的故障响应流程答:
1. 止血(分钟级):
- 确认影响面:主节点 or 从库、单实例 or 集群分片;哨兵/集群是否已完成 failover(多数场景自动切换,应用自愈);
- 若未切换:手动提升从库、客户端切流量;
- 应用侧:缓存层降级开关(熔断对 Redis 的调用,读走 DB 限流兜底 + 本地缓存),保护 DB 不被二度击垮——Redis 挂时 DB 的限流必须提前配好。
2. 定位根因:
- 内存爆:OOM 被杀?看 big key(--bigkeys)、淘汰策略是不是 noeviction、TTL 覆盖率;
- CPU 爆:慢命令阻塞(slowlog)、大 key 操作、热点 key 单分片打满、持久化 fork 压力;
- 网络/连接:连接数打满(maxclients)、带宽打满(monitor 误用、大 value 频繁拉取);
- 磁盘:AOF 写满、RDB 写盘 IO 故障。
3. 治理:
- big key 拆分、TTL 补齐、淘汰策略改 allkeys-lfu;
- 热点 key 本地缓存化;
- 容量扩容/增加分片(SCAN 双写迁移);
- 持久化与内存配比调整(fork 内存翻倍预留)。
4. 预防机制:容量水位 70% 告警、慢日志与延迟监控常开、big key 周扫、故障演练(定期 kill 节点验证自动切换与降级链路)。
核心架构观点:Redis 故障的损失取决于降级预案——缓存架构必须回答"Redis 不可用时,DB 能不能活"。
💻 全栈开发专家
"爆了"分两种:CPU 100% 或内存打满,处理顺序:止血 → 定位 → 优化 → 预防。
第一步:止血(5 分钟内)
- 客户端开启熔断降级:非核心读直接返回兜底数据,核心是别让流量全砸到 DB(Redis 挂了最大风险是 DB 被打穿);
- 入口限流降级,非核心功能先关;
- 有从库/集群其他节点,切读流量。
第二步:定位(看什么爆了)
- CPU 100%:
redis-cli --hotkey找热 key;慢查询SLOWLOG GET看有没有HGETALL/大 key 操作;info commandstats看哪类命令重; - 内存爆:
info memory+--bigkeys;淘汰策略是不是 noeviction;碎片率是否异常; - 网络:监控网卡打满没(大 value 高频读写)。
第三步:针对性优化
- 热 key → 本地缓存(Caffeine 3~5s)+ key 打散;
- bigkey → 拆分 + UNLINK 删除;
- 慢命令 → 换 SCAN/分页,禁 keys *;
- 单机瓶颈 → 上 Cluster 扩分片/读写分离;
- 单实例内存太大 → 拆实例(控制 10GB 内,防 fork 卡顿)。
第四步:预防(制度化)
- 容量水位告警(内存 70%、CPU 60%、网卡 50%);
- 大 key/热 key 巡检定时任务;
- 压测容量基线,大促前扩容;
- 降级预案演练:Redis 故障时 DB 限流值是多少、哪些接口走兜底,提前写进预案而不是临场决策。