线上 Redis 某个节点流量和延迟突然升高,你会怎么发现热 Key、大 Key 并完成治理?
我会先控制影响,再按证据定位:热 Key 是请求集中在少数 Key,容易打满单分片 CPU 或网络;大 Key 是单个值包含过多元素或字节,可能造成慢命令、网络阻塞、迁移和删除抖动。两者可能重合,但诊断指标和治理方式不同。 发现要结合请求采样、分片负载、慢日志、内存分析和业务埋点,避免直接在生产全量扫描造成额外压力。
我会先确认影响范围,同时控制故障继续放大。从流量倾斜、内存结构、扫描工具和拆分策略治理热点与大对象。热 Key 是请求集中在少数 Key,容易打满单分片 CPU 或网络;大 Key 是单个值包含过多元素或字节,可能造成慢命令、网络阻塞、迁移和删除抖动。两者可能重合,但诊断指标和治理方式不同。 发现要结合请求采样、分片负载、慢日志、内存分析和业务埋点,避免直接在生产全量扫描造成额外压力。
止损之后,我会按请求链路建立证据,而不是凭经验猜。沿着「采样识别异常 Key → 判断访问热点或体积过大 → 限制单次操作成本 → 拆分/复制/本地缓存 → 迁移并持续观测」观察输入、状态与输出,这些阶段都可以从日志、指标或源码里验证。 采样识别异常 Key 热 Key 是访问集中,Big Key 是元素或字节体积大,两者可能同时存在但治理方式不同。 判断访问热点或体积过大 可结合客户端埋点、MONITOR 采样、hotkeys 与 slowlog,避免在线全量扫描带来二次影响。 redis-cli --hotkeys:LFU 策略下热点采样。 MEMORY USAGE/SCAN:体积与成员定位。 我会先确认请求实际走到了哪条路径,再用运行数据验证,不会只看类名或配置猜测。
定位时我最关注这些参数、指标和容量关系。复制生产 Key 大小分布,用本地缓存、分桶和 UNLINK 分别验证带宽、阻塞和一致性。
找到根因后先做最小修复,再用同样的流量验证。所有请求读取一个数百 KB JSON,QPS 并不极端但网络带宽和序列化成为瓶颈。把配置拆为稳定小字段并加入进程内版本缓存后,Redis 只在版本变化时读取。 在线使用大范围 SCAN 也造成压力:单 Key QPS:热读加版本化本地缓存。 DEL 超大 Key 阻塞主线程:Value 字节与成员数:大集合按维度拆分。 固定输入和基线 先在没有故障注入的环境执行上述配置,固定数据规模、并发度、运行时版本和预热时间。以「单Key QPS」为主基线,记录值应满足「<分片能力 10%」;同时保存 单 Key QPS、Value 字节与成员数,使后续变化能够回到同一时间轴比较。
恢复阶段要逐步放量,最后把监控和边界补齐。方案:更适合的场景:主要收益:代价与边界。 本地缓存:热读且允许短暂旧值:消除网络与单 Key 读压力:失效传播与内存副本。 分桶拆 Key:热写或大集合可按维度拆分:分散单槽成本:聚合、迁移和一致性复杂。 专用实例隔离:短期无法改模型的核心热点:降低对其他业务影响:热点本身容量未消失。 选型至少带上 Key 数量、Value 大小、命令复杂度、热点分布和过期速率,并用上面的量化基线验证;未知数据应明确为待测假设。