Redis 大 Key & 热 Key 完整详解
一、概念区分
1. 大 Key(Big Key)
定义:某个 Key 对应的 Value 体积过大,或者集合元素数量极多。 两种形态:
- 字符串大 Key :
String类型 value 过大(一般阈值:>10KB,生产常按 >5KB 作为预警) - 集合大 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 带来的问题
- 网络阻塞 GET/DEL 获取大 key 时,一次性传输大量数据,占用带宽;集群环境容易造成节点网卡打满。
- Redis 主线程阻塞(最严重) Redis 单线程模型:
DEL / HGETALL / LRANGE等操作遍历大量元素,主线程长时间无法处理其他命令,出现命令超时。 - 持久化、主从同步压力大 RDB 生成、AOF 重写、主从复制传输大对象,耗时增加;扩容、迁移 key 时速度极慢。
- 集群迁移雪崩 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:拆分(最优方案)
- String 大 key 把一个大 JSON 拆分成多条独立 key;或者改用 Hash 分片。
反面:
product:info = 超大json优化:product:1001:name、product:1001:price分散存储
-
集合大 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 危害
- Redis 单节点压力打爆(集群场景典型) Redis Cluster 根据 key 槽位分配,热 key 固定落在某一个 master 节点,该节点 CPU、连接数打满,其他节点空闲,集群资源严重不均衡。
- 请求超时、雪崩 节点处理不过来,大量命令排队,业务大量超时;流量持续上涨直接节点宕机。
- 缓存击穿常伴随热 Key 热点缓存失效瞬间,海量请求击穿到数据库。
3.2 热 Key 典型业务场景
- 秒杀商品库存
- 首页公共配置、活动规则
- 热门商品详情、热搜榜单
- 全局限流计数器
3.3 热 Key 排查手段
- 监控指标 Redis 监控查看每个 key 的命令调用 QPS;集群监控单节点 CPU 突增。
- Redis 4.0+ 热点 key 追踪(ACTIVE EXPIRE 不适用,命令追踪依赖模块) 商业版 Redis(Redis Stack)支持 hotkey 追踪;开源版原生无内置命令。
- 代理层捕获(推荐生产) Twemproxy / Redis Cluster Proxy / 自研 SDK,统计 key 访问频次,识别热 key。
- 业务日志埋点 记录高频访问缓存 key,业务侧统计。
- 抓包 / 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 副本、流量分散 |
| 叠加风险 | 又大又热:传输慢 + 并发高,极易大面积超时 |
五、生产落地最佳实践总结
- 规范先行 上线前制定 Redis 开发规范:禁止超大 String、禁止超大集合,集合设置最大元素上限。
- 持续监控告警
- 监控大 key:内存阈值告警
- 监控热 key:单 key 访问 QPS 阈值、集群单节点 CPU 不均衡告警
- 编码规范
- 永远不要全量读取集合,使用 scan 分页
- 删除大集合必须分批删除
- 热点数据优先考虑本地缓存兜底
- 集群设计 尽量避免热点业务 key 固定落在同一个 slot;读多热点考虑 key 副本方案。
Redis 大 Key、热 Key 面试精简版(高频问答,可直接背诵)
一、基础概念
1. 什么是大 Key?有哪些类型?
大 Key:Value 占用内存过大,或者集合元素数量过多的 Key。 两类:
- String 类型:value 过大,一般阈值 >10KB 视为大 key;
- 容器类型(List/Hash/Set/ZSet):单个集合元素数量过多,通常 >5000 个元素。
注意:大 Key 和并发无关,只和数据大小有关。
2. 什么是热 Key?
某个 Key 短时间内被极高并发访问(QPS 极高)。 和 value 大小无关,哪怕只有几百字节,持续上万 QPS 访问就是热 key。 典型场景:秒杀库存、首页活动配置、热门商品。
3. 大 Key 和热 Key 可以同时存在吗?
可以。既是大 Key 又是热 Key 属于高危场景:大量请求传输大量数据,带宽占满 + 主线程阻塞,极易引发大面积超时。
二、大 Key 相关面试题
4. 大 Key 会带来哪些问题?
- 阻塞 Redis 主线程(最核心) Redis 是单线程模型。
DEL、HGETALL、LRANGE 0 -1等操作操作大集合,会长时间占用主线程,其他命令排队超时。 - 网络带宽压力 一次请求传输大量数据,占用网卡,影响其他正常请求。
- 集群迁移故障 Redis Cluster 迁移 slot 时,大 key 迁移耗时久,容易迁移超时,引发集群不稳定。
- 持久化、主从同步压力增大 RDB 生成、AOF 重写、主从复制传输大对象耗时增加。
5. 线上如何排查大 Key?优缺点?
redis-cli --bigkeys优点:简单,开箱即用; 缺点:只能找出每种类型最大 key,无法输出全部超标 key;扫描有 CPU 开销,禁止高峰期执行。MEMORY USAGE key精准查看单个 key 占用内存,适合定向排查。- RDB 文件离线分析(redis-rdb-tools) 生产推荐,不影响线上业务,导出全部 key 内存大小。
- 代理 / SDK 埋点,监控返回数据大小,实时告警。
❌ 禁忌:不要线上随便执行
KEYS *
6. 大 Key 有哪些解决方案?
- 数据拆分(最优)
- 超大 String:拆分成多个独立小 key;
- 大 Hash/Set/ZSet:分片存储(Hash 分片)。
- 禁止全量读取,使用迭代命令 禁用:
HGETALL、SMEMBERS、LRANGE 0 -1使用:HSCAN、SSCAN、ZSCAN分页遍历。 - 渐进式删除,禁止直接 DEL 大集合 循环 scan 分批删除元素,分散主线程压力。
- 字符串 value 做压缩(snappy/gzip),减少传输体积。
7. 为什么不能直接 DEL 一个拥有上万元素的 Hash 大 key?
DEL 底层会一次性回收所有内存,需要遍历所有元素,单线程阻塞 Redis,造成大量请求超时。
三、热 Key 相关面试题
8. 热 Key 会造成什么问题?(Redis Cluster 重点)
- 集群负载不均衡 Redis Cluster 根据 key 计算 slot,热 key 固定落在某一个 master 节点;该节点 CPU、连接数打满,其他节点空闲。
- 请求排队、大量超时,严重时节点宕机。
- 热点缓存失效时,大量请求直接打数据库,引发缓存击穿。
9. 如何排查热 Key?
- 监控层面:观察集群单个节点 CPU 突增,大概率存在热 key;
- 代理层(Twemproxy / 自研 Proxy/SDK)统计每个 key 访问频次;
- 业务日志埋点统计高频缓存 key;
- ⚠️
MONITOR命令严禁线上长时间执行,性能损耗极大,只能低峰临时调试; - 云 Redis(Tair 等)自带热 key 探测;开源原生 Redis 无内置热 key 统计命令。
10. 热 key 主流解决方案(按使用频率排序)
- 应用本地缓存(Caffeine/Guava Cache)【最常用】 请求先走 JVM 本地缓存,拦截绝大部分流量,减少 Redis 压力。
注意点:过期时间打散,避免同时失效;有数据一致性成本。
- 热 key 多副本(key 分片) 构造多个 key:
goods:stock_0、goods:stock_1,写入同步更新所有副本;读取随机选一个,分散到不同 slot、不同节点。
适合读多写少;频繁更新场景维护成本高。
- 读写分离,读请求路由从节点 主负责写,热 key 大量读分摊到 slave;缺点:存在主从数据短暂不一致。
- 业务层削峰限流 秒杀场景前置限流、MQ 排队,从源头降低并发。
- 中间件方案:Redis Proxy 识别热 key,自动缓存分流(自建复杂度高)。
11. 热 key + 缓存失效怎么处理?(缓存击穿)
常用方案:
- 互斥锁;
- 热点 key 永不过期,后台线程主动刷新;
- 结合本地缓存兜底。
四、对比总结(面试口述加分)
表格
| 大 Key | 热 Key | |
|---|---|---|
| 本质 | 数据体量巨大 | 访问并发极高 |
| 核心风险 | 主线程阻塞、带宽占用、集群迁移失败 | 单节点压力飙升、集群资源倾斜 |
| 危险操作 | DEL、全量查询命令 | 高频 GET 循环访问 |
| 治理思路 | 拆分、分页、渐进删除 | 流量分散、本地缓存、多副本 |
五、面试官高频追问连环题
Q:项目中有没有遇到过大 key?怎么发现,怎么解决? 参考回答模板: 线上通过定时执行
--bigkeys巡检发现一个存储商品明细的大 Hash,元素上万。直接 DEL 会阻塞 Redis。解决方案:
- 业务层面进行 Hash 分片拆分;
- 历史旧数据分批清理,使用 HSCAN 循环 HDEL 渐进删除;
- 开发规范增加限制,单个 Hash 元素不允许超过 5000。
Q:线上遇到热 key 怎么处理? 参考回答模板: 秒杀商品库存为热 key,大量请求集中一个 slot 导致单节点 CPU 偏高。 方案:引入应用本地 Caffeine 缓存拦截大部分读请求;同时设置热点缓存永不过期,后台定时主动更新,防止缓存击穿;压测验证节点压力明显下降。
附件:Redis 开发规范(可直接发给团队 / 写进文档)
Redis 使用规范(大 Key & 热 Key 治理核心条款)
- Key 规范
- key 命名清晰,控制 key 长度;
- String 类型 value 建议不超过 10KB;
- 容器类型强制约束 Hash/List/Set/ZSet 单个集合元素上限 5000;超过必须分片拆分。
- 命令规范 ✅ 禁止:
KEYS *、HGETALL、SMEMBERS、LRANGE 0 -1✅ 集合遍历统一使用SCAN系列迭代命令分页获取。 - 删除规范 容器类型大对象禁止直接 DEL,代码分批循环删除。
- 热点数据规范 预估 QPS 极高的热点数据,优先考虑接入本地缓存;读多场景可设计多副本 key 分散压力。
- 监控告警
- 开启大 key 监控,内存超阈值告警;
- 监控集群节点 CPU 不均衡,识别潜在热 key;
- 集群规范 避免业务热点 key 固定落在同一个 slot,防止节点压力倾斜。