在 Redis 的日常运维与面试考察中,大 key 和 热 key 是两个绕不开的核心话题。它们不仅直接关系到内存使用效率,更会引发响应延迟、集群倾斜甚至服务雪崩。本文将从实际场景出发,系统讲解如何排查与治理这两类问题。
一、什么是大 key 和热 key?
大 key:指单个 key 的 value 体积过大,或集合类数据结构(Hash、List、Set、ZSet)中元素数量过多。通常认为 String 类型 value 超过 10KB,或集合元素超过 5000 个,即可视为大 key。
热 key:指在短时间内被高频访问的 key。例如秒杀商品、热门新闻、明星八卦等,QPS 可能达到数万甚至数十万,远超单节点处理能力。
两者危害不同:大 key 导致内存不均、阻塞、网络拥塞;热 key 导致单节点 CPU 打满、集群倾斜、缓存击穿。
二、大 key 的排查方法
1. 使用 redis-cli –bigkeys
这是最常用的官方工具,通过扫描全量 key 并统计各类型最大 key:
redis-cli -h 127.0.0.1 -p 6379 --bigkeys
输出会列出每种数据类型中最大的 key 及其大小。注意该命令使用 SCAN,不会阻塞,但会消耗一定 CPU。
2. 使用 MEMORY USAGE 命令
对可疑 key 精确计算内存占用:
redis-cli memory usage mykey
3. 使用 RDB 分析工具
离线分析 RDB 文件,如 redis-rdb-tools:
rdb -c memory dump.rdb --bytes 10240 -f memory.csv
可导出所有大于 10KB 的 key,适合定期巡检。
4. 通过 slowlog 发现
大 key 操作往往耗时较长,SLOWLOG GET 可捕获相关命令。
三、大 key 的治理方案
1. 拆分
- String 拆分:将大 value 拆成多个小 key,如
user:1:part1、user:1:part2。 - 集合拆分:按 hash 取模或范围拆分为多个子集合,如
hash:1、hash:2。
2. 压缩
对文本类 value 使用 Gzip、Snappy 等压缩后再存储,读取时解压。
3. 清理与过期
- 对无用大 key 及时
DEL,注意使用UNLINK异步删除避免阻塞。 - 设置合理 TTL,避免数据无限堆积。
4. 选型优化
- 用 Hash 替代多个 String 存储对象,减少 key 数量。
- 避免使用
KEYS *、HGETALL等全量操作,改用HSCAN、SSCAN。
四、热 key 的排查方法
1. 业务侧埋点统计
在客户端或代理层(如 Twemproxy、Codis)统计 key 访问频率,是最直接的方式。
2. 使用 redis-cli –hotkeys
Redis 4.0 以上支持:
redis-cli --hotkeys
基于 LFU 淘汰策略统计访问频率,需先将 maxmemory-policy 设为 allkeys-lfu 或 volatile-lfu。
3. 使用 MONITOR 命令
实时抓取所有命令,但性能开销大,仅适合短时排查:
redis-cli monitor | grep "hotkey"
4. 网络流量分析
通过抓包工具(tcpdump)或 Redis 慢查询日志间接发现热点。
五、热 key 的治理方案
1. 本地缓存
在客户端使用 Guava、Caffeine 等做一级缓存,减少对 Redis 的访问。
2. 读写分离与多副本
- 增加从节点,通过
READONLY将读流量分散到多个副本。 - 使用 Redis Cluster 时,可将热 key 复制到多个节点。
3. key 散列
将热 key 拆分为多个子 key,如 hotkey:1、hotkey:2……hotkey:N,客户端随机选择,分散压力。
4. 限流与降级
- 对热 key 的访问做限流,超出阈值直接返回降级数据。
- 结合布隆过滤器防止缓存穿透。
5. 使用 Proxy 层
如京东 HOTKEY、有赞 TMC 等框架,自动发现热 key 并推送到本地缓存。
六、面试高频问题
-
如何发现大 key?
答:--bigkeys、MEMORY USAGE、RDB 分析、slowlog。 -
大 key 删除会阻塞吗?
答:DEL会阻塞,推荐UNLINK异步删除。 -
热 key 有什么危害?
答:单节点 CPU 打满、集群倾斜、缓存击穿、服务雪崩。 -
如何解决热 key?
答:本地缓存、key 散列、多副本、限流降级、Proxy 层。 -
大 key 和热 key 能同时存在吗?
答:可以,例如一个超大 Hash 被高频访问,需同时拆分和分散。
七、总结
大 key 和热 key 的治理核心在于 “拆” 与 “散”:大 key 要拆分、压缩、清理;热 key 要分散、缓存、限流。实际生产中,建议建立常态化巡检机制,结合监控告警,提前发现并处理,避免故障发生。
掌握这些排查与治理手段,不仅能应对面试,更能直接提升线上 Redis 的稳定性与性能。
未经允许不得转载:任鹏个人博客 » Redis 大 key 和热 key 的排查与治理方案

