redis 的大 key 和热 key 详解

Redis 大 Key & 热 Key 完整详解

一、概念区分

1. 大 Key(Big Key)

定义:某个 Key 对应的 Value 体积过大,或者集合元素数量极多。 两种形态:

  1. 字符串大 KeyString 类型 value 过大(一般阈值:>10KB,生产常按 >5KB 作为预警)
  2. 集合大 Key :List/Hash/Set/ZSet,元素数量巨大(通常阈值:单个集合 > 5000 个元素

业界通用参考标准(可根据业务调整)

  • String:value ≥ 10KB
  • Hash/List/Set/ZSet:元素数量 ≥ 5000

2. 热 Key(Hot Key)

定义 :某一个 Key 被超高并发访问(QPS 极高),大量请求集中打在同一个 key 上。 特征:上万 QPS 集中访问同一个 key,与 value 大小无关。

举例:秒杀商品库存、活动首页配置、全局热点数据,哪怕 value 只有几百字节,依然是热 Key。
关键区别: ✅ 大 Key:数据体量问题 ✅ 热 Key:访问流量问题 存在叠加场景:既是大 Key 又是热 Key,危害翻倍。


二、大 Key 危害、产生原因、排查、解决方案

2.1 大 Key 带来的问题

  1. 网络阻塞 GET/DEL 获取大 key 时,一次性传输大量数据,占用带宽;集群环境容易造成节点网卡打满。
  2. Redis 主线程阻塞(最严重) Redis 单线程模型:DEL / HGETALL / LRANGE 等操作遍历大量元素,主线程长时间无法处理其他命令,出现命令超时。
  3. 持久化、主从同步压力大 RDB 生成、AOF 重写、主从复制传输大对象,耗时增加;扩容、迁移 key 时速度极慢。
  4. 集群迁移雪崩 Redis Cluster 迁移 slot 时,如果碰到大 key,迁移超时失败,引发集群不稳定。

2.2 大 Key 常见场景

  • 把一整页列表全部塞进一个 List
  • 一个 Hash 存储上万条业务明细(没有拆分)
  • 超大 JSON 字符串直接作为 String 存入 Redis
  • 历史数据不清理,集合持续膨胀

2.3 如何排查大 Key

方式 1:redis-cli --bigkeys(线上轻量排查)

复制代码
redis-cli -h ip -p port --bigkeys

扫描所有 key,统计每种类型最大 key,缺点:只能找出最大的一批,无法输出全部超标 key;扫描期间有 CPU 消耗,低峰执行

方式 2:MEMORY USAGE(精准查看内存占用)

复制代码
MEMORY USAGE key_name

返回 key 占用字节数,支持采样估算。

方式 3:RDB 文件离线分析(生产推荐)

使用 redis-rdb-tools 解析 rdb,导出所有 key 内存大小,适合不影响线上流量。

方式 4:监控埋点

自研中间件 / 代理层捕获命令,记录返回值大小,告警大 key。

2.4 大 Key 优化方案

方案 1:拆分(最优方案)

  1. String 大 key 把一个大 JSON 拆分成多条独立 key;或者改用 Hash 分片。

反面:product:info = 超大json 优化:product:1001:nameproduct:1001:price 分散存储

  1. 集合大 key 拆分(Hash/Set/ZSet) Hash 分片:

    原大hash user:order

    拆分为 user:order:{0} ~ user:order:{9}

    HSET user:order:{idx} orderId data

ZSet 热点排行榜分片、List 分页拆分。

方案 2:避免全量操作,使用分页命令

禁止:HGETALL、LRANGE 0 -1、SMEMBERS 改用:

复制代码
HSCAN、SSCAN、ZSCAN 迭代遍历
LRANGE list start end 分页获取

方案 3:渐进式删除(绝对不要直接 DEL 大 key!)

DEL 大集合会阻塞主线程,使用循环分批删除:

复制代码
# Hash示例,循环scan+hdel
HSCAN key 0 COUNT 100

代码分批删除,每次删少量元素,分散 CPU 压力。

方案 4:压缩 value

String 类型 JSON 使用 snappy/gzip 压缩后存入,降低网络传输大小。

❌ 禁忌:不要存储几十 MB 的超大字符串!


三、热 Key 危害、产生原因、排查、解决方案

3.1 热 Key 危害

  1. Redis 单节点压力打爆(集群场景典型) Redis Cluster 根据 key 槽位分配,热 key 固定落在某一个 master 节点,该节点 CPU、连接数打满,其他节点空闲,集群资源严重不均衡
  2. 请求超时、雪崩 节点处理不过来,大量命令排队,业务大量超时;流量持续上涨直接节点宕机。
  3. 缓存击穿常伴随热 Key 热点缓存失效瞬间,海量请求击穿到数据库。

3.2 热 Key 典型业务场景

  • 秒杀商品库存
  • 首页公共配置、活动规则
  • 热门商品详情、热搜榜单
  • 全局限流计数器

3.3 热 Key 排查手段

  1. 监控指标 Redis 监控查看每个 key 的命令调用 QPS;集群监控单节点 CPU 突增。
  2. Redis 4.0+ 热点 key 追踪(ACTIVE EXPIRE 不适用,命令追踪依赖模块) 商业版 Redis(Redis Stack)支持 hotkey 追踪;开源版原生无内置命令。
  3. 代理层捕获(推荐生产) Twemproxy / Redis Cluster Proxy / 自研 SDK,统计 key 访问频次,识别热 key。
  4. 业务日志埋点 记录高频访问缓存 key,业务侧统计。
  5. 抓包 / MONITOR(严禁线上长时间执行!) MONITOR 会极大消耗 Redis 性能,仅短暂低峰调试。

3.4 热 Key 主流解决方案

方案 1:本地缓存(最常用)

在应用服务器内存做一层本地缓存(Caffeine/Guava Cache)。 流程: 请求 → JVM 本地缓存 → 未命中 → 请求 Redis

优点:直接拦截大部分流量,Redis 压力骤降 注意:

  • 做好缓存过期时间错开,防止同时失效(缓存风暴
  • 数据一致性要求高的场景,需要消息通知更新本地缓存

方案 2:热 key 副本(集群分片副本)

同一个热 key,构造多个不同 key,分散到不同槽位:

复制代码
goods:stock_0
goods:stock_1
goods:stock_2

写入时同步写全部副本;读取时随机选其中一个 key 访问。 把流量分散到集群多个节点,解决单节点热点。

适合读多写少场景;写多场景维护成本高。

方案 3:读写分离 + 从节点分担读请求

热 key 大量读请求,路由到 slave 节点读取;写请求走 master。

局限:主从同步存在短暂数据不一致;高并发写场景效果有限。

方案 4:业务层限流、队列削峰

秒杀场景:业务前置限流,通过 MQ 削峰,减少打到 Redis 的并发。

方案 5:代理层智能路由(中间件方案)

如阿里云 Redis、Tair 等云存储内置热 key 自动缓存 / 分流;自建可基于 Redis Proxy 实现热 key 识别与分流。

重点坑提醒

热 key + 缓存失效 = 缓存击穿 解决方案组合:互斥锁、永不过期、定时主动刷新热点缓存。


四、大 Key vs 热 Key 对比汇总表

表格

维度 大 Key 热 Key
核心问题 数据体积过大 访问并发极高
性能风险 主线程阻塞、带宽占用、迁移慢 单节点 CPU 打满、集群倾斜
典型危险命令 DEL、HGETALL、LRANGE 全量查询 GET 高频循环调用
通用优化思路 拆分、分页、渐进删除 本地缓存、key 副本、流量分散
叠加风险 又大又热:传输慢 + 并发高,极易大面积超时

五、生产落地最佳实践总结

  1. 规范先行 上线前制定 Redis 开发规范:禁止超大 String、禁止超大集合,集合设置最大元素上限。
  2. 持续监控告警
  • 监控大 key:内存阈值告警
  • 监控热 key:单 key 访问 QPS 阈值、集群单节点 CPU 不均衡告警
  1. 编码规范
  • 永远不要全量读取集合,使用 scan 分页
  • 删除大集合必须分批删除
  • 热点数据优先考虑本地缓存兜底
  1. 集群设计 尽量避免热点业务 key 固定落在同一个 slot;读多热点考虑 key 副本方案。

Redis 大 Key、热 Key 面试精简版(高频问答,可直接背诵)

一、基础概念

1. 什么是大 Key?有哪些类型?

大 Key:Value 占用内存过大,或者集合元素数量过多的 Key。 两类:

  1. String 类型:value 过大,一般阈值 >10KB 视为大 key;
  2. 容器类型(List/Hash/Set/ZSet):单个集合元素数量过多,通常 >5000 个元素

注意:大 Key 和并发无关,只和数据大小有关。

2. 什么是热 Key?

某个 Key 短时间内被极高并发访问(QPS 极高)。 和 value 大小无关,哪怕只有几百字节,持续上万 QPS 访问就是热 key。 典型场景:秒杀库存、首页活动配置、热门商品。

3. 大 Key 和热 Key 可以同时存在吗?

可以。既是大 Key 又是热 Key 属于高危场景:大量请求传输大量数据,带宽占满 + 主线程阻塞,极易引发大面积超时。


二、大 Key 相关面试题

4. 大 Key 会带来哪些问题?

  1. 阻塞 Redis 主线程(最核心) Redis 是单线程模型。DEL、HGETALL、LRANGE 0 -1 等操作操作大集合,会长时间占用主线程,其他命令排队超时。
  2. 网络带宽压力 一次请求传输大量数据,占用网卡,影响其他正常请求。
  3. 集群迁移故障 Redis Cluster 迁移 slot 时,大 key 迁移耗时久,容易迁移超时,引发集群不稳定。
  4. 持久化、主从同步压力增大 RDB 生成、AOF 重写、主从复制传输大对象耗时增加。

5. 线上如何排查大 Key?优缺点?

  1. redis-cli --bigkeys 优点:简单,开箱即用; 缺点:只能找出每种类型最大 key,无法输出全部超标 key;扫描有 CPU 开销,禁止高峰期执行。
  2. MEMORY USAGE key 精准查看单个 key 占用内存,适合定向排查。
  3. RDB 文件离线分析(redis-rdb-tools) 生产推荐,不影响线上业务,导出全部 key 内存大小。
  4. 代理 / SDK 埋点,监控返回数据大小,实时告警。

❌ 禁忌:不要线上随便执行KEYS *

6. 大 Key 有哪些解决方案?

  1. 数据拆分(最优)
    • 超大 String:拆分成多个独立小 key;
    • 大 Hash/Set/ZSet:分片存储(Hash 分片)。
  2. 禁止全量读取,使用迭代命令 禁用:HGETALL、SMEMBERS、LRANGE 0 -1 使用:HSCAN、SSCAN、ZSCAN 分页遍历。
  3. 渐进式删除,禁止直接 DEL 大集合 循环 scan 分批删除元素,分散主线程压力。
  4. 字符串 value 做压缩(snappy/gzip),减少传输体积。

7. 为什么不能直接 DEL 一个拥有上万元素的 Hash 大 key?

DEL 底层会一次性回收所有内存,需要遍历所有元素,单线程阻塞 Redis,造成大量请求超时。


三、热 Key 相关面试题

8. 热 Key 会造成什么问题?(Redis Cluster 重点)

  1. 集群负载不均衡 Redis Cluster 根据 key 计算 slot,热 key 固定落在某一个 master 节点;该节点 CPU、连接数打满,其他节点空闲。
  2. 请求排队、大量超时,严重时节点宕机。
  3. 热点缓存失效时,大量请求直接打数据库,引发缓存击穿

9. 如何排查热 Key?

  1. 监控层面:观察集群单个节点 CPU 突增,大概率存在热 key;
  2. 代理层(Twemproxy / 自研 Proxy/SDK)统计每个 key 访问频次;
  3. 业务日志埋点统计高频缓存 key;
  4. ⚠️ MONITOR 命令严禁线上长时间执行,性能损耗极大,只能低峰临时调试;
  5. 云 Redis(Tair 等)自带热 key 探测;开源原生 Redis 无内置热 key 统计命令。

10. 热 key 主流解决方案(按使用频率排序)

  1. 应用本地缓存(Caffeine/Guava Cache)【最常用】 请求先走 JVM 本地缓存,拦截绝大部分流量,减少 Redis 压力。

注意点:过期时间打散,避免同时失效;有数据一致性成本。

  1. 热 key 多副本(key 分片) 构造多个 key:goods:stock_0、goods:stock_1,写入同步更新所有副本;读取随机选一个,分散到不同 slot、不同节点。

适合读多写少;频繁更新场景维护成本高。

  1. 读写分离,读请求路由从节点 主负责写,热 key 大量读分摊到 slave;缺点:存在主从数据短暂不一致。
  2. 业务层削峰限流 秒杀场景前置限流、MQ 排队,从源头降低并发。
  3. 中间件方案:Redis Proxy 识别热 key,自动缓存分流(自建复杂度高)。

11. 热 key + 缓存失效怎么处理?(缓存击穿)

常用方案:

  • 互斥锁;
  • 热点 key 永不过期,后台线程主动刷新;
  • 结合本地缓存兜底。

四、对比总结(面试口述加分)

表格

大 Key 热 Key
本质 数据体量巨大 访问并发极高
核心风险 主线程阻塞、带宽占用、集群迁移失败 单节点压力飙升、集群资源倾斜
危险操作 DEL、全量查询命令 高频 GET 循环访问
治理思路 拆分、分页、渐进删除 流量分散、本地缓存、多副本

五、面试官高频追问连环题

Q:项目中有没有遇到过大 key?怎么发现,怎么解决? 参考回答模板: 线上通过定时执行--bigkeys巡检发现一个存储商品明细的大 Hash,元素上万。直接 DEL 会阻塞 Redis。解决方案:

  1. 业务层面进行 Hash 分片拆分;
  2. 历史旧数据分批清理,使用 HSCAN 循环 HDEL 渐进删除;
  3. 开发规范增加限制,单个 Hash 元素不允许超过 5000。

Q:线上遇到热 key 怎么处理? 参考回答模板: 秒杀商品库存为热 key,大量请求集中一个 slot 导致单节点 CPU 偏高。 方案:引入应用本地 Caffeine 缓存拦截大部分读请求;同时设置热点缓存永不过期,后台定时主动更新,防止缓存击穿;压测验证节点压力明显下降。


附件:Redis 开发规范(可直接发给团队 / 写进文档)

Redis 使用规范(大 Key & 热 Key 治理核心条款)

  1. Key 规范
    • key 命名清晰,控制 key 长度;
    • String 类型 value 建议不超过 10KB;
  2. 容器类型强制约束 Hash/List/Set/ZSet 单个集合元素上限 5000;超过必须分片拆分。
  3. 命令规范 ✅ 禁止:KEYS *、HGETALL、SMEMBERS、LRANGE 0 -1 ✅ 集合遍历统一使用 SCAN 系列迭代命令分页获取。
  4. 删除规范 容器类型大对象禁止直接 DEL,代码分批循环删除。
  5. 热点数据规范 预估 QPS 极高的热点数据,优先考虑接入本地缓存;读多场景可设计多副本 key 分散压力。
  6. 监控告警
    • 开启大 key 监控,内存超阈值告警;
    • 监控集群节点 CPU 不均衡,识别潜在热 key;
  7. 集群规范 避免业务热点 key 固定落在同一个 slot,防止节点压力倾斜。
相关推荐
AI砖家1 小时前
多智能体系统实战:架构设计、数据库表设计与 Skill 体系
数据库·多智能体·skill·agent架构设计·agengt
夜雪一千2 小时前
MySQL查询条件的顺序是否影响查询效率
数据库·mysql
X-⃢_⃢-X2 小时前
十、Redis之布隆过滤器
数据库·redis·缓存
Nturmoils2 小时前
订单号查出了三笔,我以为是数据脏了,其实是自己写错了
数据库
ZKNOW甄知科技2 小时前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
TDengine (老段)2 小时前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技2 小时前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
这就是佬们吗2 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
吴声子夜歌2 小时前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb