Redis 大 key 和热 key 的排查与治理方案

在 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:part1user:1:part2
  • 集合拆分:按 hash 取模或范围拆分为多个子集合,如 hash:1hash:2

2. 压缩

对文本类 value 使用 Gzip、Snappy 等压缩后再存储,读取时解压。

3. 清理与过期

  • 对无用大 key 及时 DEL,注意使用 UNLINK 异步删除避免阻塞。
  • 设置合理 TTL,避免数据无限堆积。

4. 选型优化

  • 用 Hash 替代多个 String 存储对象,减少 key 数量。
  • 避免使用 KEYS *HGETALL 等全量操作,改用 HSCANSSCAN

四、热 key 的排查方法

1. 业务侧埋点统计

在客户端或代理层(如 Twemproxy、Codis)统计 key 访问频率,是最直接的方式。

2. 使用 redis-cli –hotkeys

Redis 4.0 以上支持:

redis-cli --hotkeys

基于 LFU 淘汰策略统计访问频率,需先将 maxmemory-policy 设为 allkeys-lfuvolatile-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:1hotkey:2……hotkey:N,客户端随机选择,分散压力。

4. 限流与降级

  • 对热 key 的访问做限流,超出阈值直接返回降级数据。
  • 结合布隆过滤器防止缓存穿透。

5. 使用 Proxy 层

如京东 HOTKEY、有赞 TMC 等框架,自动发现热 key 并推送到本地缓存。

六、面试高频问题

  1. 如何发现大 key?
    答:--bigkeysMEMORY USAGE、RDB 分析、slowlog。

  2. 大 key 删除会阻塞吗?
    答:DEL 会阻塞,推荐 UNLINK 异步删除。

  3. 热 key 有什么危害?
    答:单节点 CPU 打满、集群倾斜、缓存击穿、服务雪崩。

  4. 如何解决热 key?
    答:本地缓存、key 散列、多副本、限流降级、Proxy 层。

  5. 大 key 和热 key 能同时存在吗?
    答:可以,例如一个超大 Hash 被高频访问,需同时拆分和分散。

七、总结

大 key 和热 key 的治理核心在于 “拆”“散”:大 key 要拆分、压缩、清理;热 key 要分散、缓存、限流。实际生产中,建议建立常态化巡检机制,结合监控告警,提前发现并处理,避免故障发生。

掌握这些排查与治理手段,不仅能应对面试,更能直接提升线上 Redis 的稳定性与性能。

未经允许不得转载:任鹏个人博客 » Redis 大 key 和热 key 的排查与治理方案

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏