大 key 与热 key
用途:处理“单命令耗时高”“单节点被打满”“迁移卡住”这三类问题
定义与判定
「定义与判定」小节链接| 类型 | 经验阈值 | 危害 |
|---|---|---|
| 大 key | String value > 10KB;集合元素 > 5000 或总大小 > 10MB | 网络阻塞、序列化耗时、删除卡顿、迁移与备份慢、复制积压 |
| 热 key | 单 key QPS 明显高于其他(如 > 万级) | 单分片 CPU/带宽打满,Cluster 无法通过加分片解决 |
发现手段:
redis-cli --bigkeys(采样扫描,注意会遍历)、--hotkeys(需 maxmemory-policy 为 LFU 类)。MEMORY USAGE key、DEBUG OBJECT(慎用)。- RDB 离线分析工具(如 rdb-tools 类)适合全量盘点且不影响线上。
- 客户端/代理层指标:单 key QPS 与响应字节数、慢查询日志
SLOWLOG、INFO commandstats。
大 key 治理
「大 key 治理」小节链接| 手法 | 做法 |
|---|---|
| 拆分 | 大 Hash/Set/ZSet 按字段或 ID 哈希拆成 N 个子 key(user:1000:shard:3) |
| 压缩 | 值序列化前压缩(zstd/lz4),或只存必要字段 |
| 分层存储 | 缓存只存索引/摘要,明细走 DB 或对象存储 |
| 异步删除 | UNLINK 替代 DEL,避免大 key 删除阻塞主线程 |
| 禁止全量读取 | 用 HSCAN/ZSCAN/HRANDFIELD 分批,替代 HGETALL/SMEMBERS |
| 生命周期 | 给所有缓存 key 设 TTL,避免只增不减 |
热 key 治理
「热 key 治理」小节链接- 多级缓存:本地缓存(Caffeine)吸收绝大部分读,设短 TTL(几十到几百毫秒)以控制不一致。
- key 打散:写热点(计数)拆成
counter:{id}:{0..N},读时求和;或用HINCRBY分片。 - 读写分离与副本:热读分散到多个从库(注意延迟)。
- 合并写:客户端缓冲 + 批量刷(计数类),降低 QPS 到 Redis 的压力。
- 隔离:热点业务单独实例,避免影响同实例其他 key。
- 探测与自动处理:部分代理/客户端支持热 key 探测与自动本地缓存。
迁移与容量影响
「迁移与容量影响」小节链接大 key 会导致 slot 迁移缓慢、复制全量同步时间长、AOF 重写与备份体积膨胀。上线前把“单 key 上限”写进规范并在 CI/巡检中检查,比事后治理成本低得多。
常见误区
「常见误区」小节链接| 误区 | 修正 |
|---|---|
用 KEYS/MONITOR 排查热点 |
本身就会打挂实例,改用 SLOWLOG、INFO、离线 RDB 分析 |
| 以为 Cluster 能解决热 key | 分片按 key 路由,单 key 仍在单节点 |
删除大 key 用 DEL |
用 UNLINK 或分批删除 |
| 只做本地缓存不设失效 | 本地层成为不一致的主要来源,需要短 TTL + 主动失效 |
延伸阅读
「延伸阅读」小节链接- Redis 官方文档:Performance、UNLINK、SLOWLOG
- 各云厂商 Redis 最佳实践中的大 key/热 key 章节