跳转到内容

大 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。
手法 做法
拆分 大 Hash/Set/ZSet 按字段或 ID 哈希拆成 N 个子 key(user:1000:shard:3)
压缩 值序列化前压缩(zstd/lz4),或只存必要字段
分层存储 缓存只存索引/摘要,明细走 DB 或对象存储
异步删除 UNLINK 替代 DEL,避免大 key 删除阻塞主线程
禁止全量读取 用 HSCAN/ZSCAN/HRANDFIELD 分批,替代 HGETALL/SMEMBERS
生命周期 给所有缓存 key 设 TTL,避免只增不减
  1. 多级缓存:本地缓存(Caffeine)吸收绝大部分读,设短 TTL(几十到几百毫秒)以控制不一致。
  2. key 打散:写热点(计数)拆成 counter:{id}:{0..N},读时求和;或用 HINCRBY 分片。
  3. 读写分离与副本:热读分散到多个从库(注意延迟)。
  4. 合并写:客户端缓冲 + 批量刷(计数类),降低 QPS 到 Redis 的压力。
  5. 隔离:热点业务单独实例,避免影响同实例其他 key。
  6. 探测与自动处理:部分代理/客户端支持热 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 章节