Redis 大 Key 与热 Key:治理实战

线上 Redis 的两大杀手:大 Key(单个 key 值巨大)和热 Key(单个 key 被疯狂访问)。一个阻塞集群,一个打爆节点。这篇文章是两次事故后的完整治理方案。

一、大 Key:阻塞的元凶

问题

一 → → → 个 每 R 超 k 次 e 时 e 操 d 、 y 作 i 雪 这 s 崩 存 、 了 k 是 集 e 单 群 5 y 线 故 0 : 程 障 0 网 , M 络 一 B 传 个 输 慢 的 命 列 5 令 表 0 ( 0 = 比 M 如 B 全 全 、 库 量 内 卡 用 存 顿 户 拷 贝 I 、 D 阻 ) 塞 其 他 命 令

本质:Redis 单线程模型下,慢命令的代价由全库承担。

发现

1
2
3
4
5
6
7
8
# 1. 用 SCAN 找大 key(生产安全,不阻塞)
redis-cli --bigkeys --scan --pattern '*'

# 2. 按类型排查
redis-cli --bigkeys

# 3. 监控慢命令
redis-cli slowlog get 20

治理

1 2 3 4 . . . . 拆 大 大 限 列 h 压 大 禁 K 分 列 长 表 a 缩 止 E : 表 h : 限 s / v 操 Y a 长 h 迁 a 作 S → s ( 移 l : h 保 限 : u * 按 留 字 e 、 时 → 最 段 S 间 近 数 → M / 按 E 用 业 N 压 M 户 务 缩 B 域 条 存 E I 拆 , 储 R D 分 L 或 S ( P 迁 分 各 O 出 全 桶 域 P ( 量 ( 独 如 、 u 立 清 S s 理 J O e k ) S R r e O T : y N 2 ) 大 0 存 数 2 文 据 6 件 集 : , 0 R → 1 e d 用 / i s S u C s 存 A e 引 N r 用 / : ) 分 2 批 0 2 6 : 0 2 )

二、热 Key:打爆单节点的元凶

问题

一 → → 个 单 其 k 节 他 e 点 请 y 求 C 全 每 P 部 秒 U 排 队 1 打 0 满 → ( 万 即 集 次 使 群 读 集 假 ( 群 死 比 有 如 爆 1 款 0 商 品 个 、 节 热 点 点 , 新 这 闻 个 ) k e y 固 定 在 一 个 节 点 )

本质:Redis 集群按 key 分布,热 key 的访问无法分片。

发现

1 2 3 . . . 监 访 代 控 问 理 : 统 层 节 计 统 点 : 计 R : C e 客 P d 户 U i 端 s 不 S 均 4 D 衡 . K ( 0 一 + 侧 个 统 节 用 计 点 L k 9 F e 0 U y % , 策 访 其 略 问 他 频 + 次 1 0 O % B ) J E C T F R E Q

治理

1 2 3 4 . . . . 本 热 命 热 h 写 降 热 限 对 地 中 o 入 级 流 热 缓 k 率 k t 时 : k : 存 e e _ 写 e k ( y 9 y k y e 最 0 e N y 高 加 % 复 y 数 效 一 + 制 份 据 的 ) 层 ( → ( 可 写 : 应 → 打 写 容 操 用 散 h 放 忍 作 本 R ) o 大 延 限 地 e : t , 迟 流 缓 d _ 只 , 存 i k 适 → 防 ( s e 合 止 C y 读 降 " a 压 # 多 级 缓 f 力 1 写 为 存 f 降 少 " 击 e 一 ~ ) 缓 穿 i 个 存 " n 量 # 快 叠 e 级 N 照 加 / ( " 进 复 ( 程 制 每 分 m N 钟 a 刷 p 份 新 ) , 一 随 次 机 ) 读 )

三、两个事故复盘

事故 1:大 Key 引发的全库阻塞

现 定 根 修 效 象 位 因 复 果 : : : : : 线 s 用 标 慢 上 l 户 签 命 o 标 按 令 R w 签 业 消 e l 集 务 失 d o 合 域 , i g 存 拆 P s 了 分 9 发 9 间 现 2 + 歇 0 回 性 S 0 限 到 卡 I 长 顿 N 万 5 , T 会 + m P E 员 s 9 R 计 9 I 算 操 D 改 飙 作 为 到 耗 的 分 时 单 批 3 个 s 8 s k e y , 每 天 全 量 计 算 交 集

事故 2:热 Key 打爆节点

现 定 根 修 效 象 位 因 复 果 : : : : : 活 节 活 应 R 动 点 动 用 e 开 商 本 d 始 C 品 地 i 后 P 库 缓 s U 存 存 R ( 读 e 严 k 1 d 重 e s Q i 不 y P s 均 T S 衡 每 T 单 秒 L 从 节 ) 点 8 + 8 C 万 库 万 P 次 存 降 U 读 到 k 1 e 3 0 y 0 0 0 % 分 0 , 片 , 集 节 群 点 整 体 C 超 P 时 U 回 3 0 %

四、预防体系

✅ ✅ ✅ ✅ ✅ 上 巡 监 规 应 线 检 控 范 急 前 : : : 预 : - 节 禁 案 k - 点 止 : e b 热 y i C K g P E k 设 k U Y e 计 e S y 评 y 均 / 审 s 衡 全 本 ( 度 量 地 预 每 、 操 缓 估 周 慢 作 存 跑 命 , 开 s 一 令 列 关 i 次 、 表 、 z , 内 / 降 e 大 存 集 级 / 趋 合 开 访 k 势 限 关 问 e 长 量 y ) 告 警

五、避坑清单

✅ ✅ ✅ ✅ 大 热 热 治 理 k k k 后 e e e 必 y y y 须 回 排 优 分 归 查 先 片 压 用 本 要 测 地 注 ( S 缓 意 验 C 存 写 证 A ( 放 阻 N 简 大 塞 ( 单 ( 消 K 高 写 失 E 效 多 ) Y ) 读 S , 少 再 别 会 考 用 雪 虑 ) 上 复 加 制 霜 分 ) 片

总结

大 Key 与热 Key 的核心认知:

  1. 大 Key 阻塞全局:Redis 单线程,慢命令=全库卡顿
  2. 热 Key 无法分片:集群也救不了单个 key 的访问热点
  3. 治理三板斧:拆分(大 key)、本地缓存(热 key)、降级兜底
  4. 预防 > 救火:key 设计评审 + 巡检 + 监控

Redis 的性能杀手从来不是"数据量大",是"单个 key 的极端情况"。 把大 key 拆掉、热 key 挡住,Redis 才能稳定扛住业务。