一、什么是 Redis 热 key?
热 key(Hot Key)定义:
在单位时间内被**频繁访问(读/写)**的 key,导致其访问集中、压力过大。
热 key 常见表现:
-
QPS 极高(某 key 每秒被访问几万次)
-
某业务高频读写一个 key(如秒杀库存、排行榜 top1)
-
Redis 实例 CPU 异常,却只服务一个 key
热 key 的风险:
问题 | 说明 |
---|---|
单点压力过大 | 所有请求打到同一个 key 上 |
缓存击穿 | 热 key 过期瞬间,大量请求落到 DB |
主从复制延迟 | 热 key 改变频繁 → 主从同步数据猛增 |
节点不均衡(集群) | Redis Cluster 中 key 分布不均匀 |
热 key 解决方案:
方案 | 原理 / 思路 |
---|---|
✅ 本地缓存(Golang map / Caffeine) | 热 key 前移到本地,不打 Redis |
✅ 请求合并(Request Merge) | 多个请求合并为一次查询 |
✅ 多 key 拆分(Sharding) | 拆成 key_1 , key_2 , …,均摊压力 |
✅ 设置过期+预热机制 | 防止同时失效,导致“缓存击穿” |
✅ 热 key 限流 | 对热点 key 特判,限流/降级 |
✅ 使用布隆过滤器 / 异步加载 | 防穿透 / 控制负载 |
二、什么是 Redis 大 key?
大 key(Big Key)定义:
指的是 value 太大(例如一个 Hash 内含几百万个 field,或一个 List 有 10 万项以上)或**字符串体积超大(如几 MB 图片)**的 key。
大 key 的风险:
问题 | 说明 |
---|---|
❗ 删除阻塞 | DEL 大 key 时会阻塞 Redis 单线程 |
❗ 主从复制变慢 / 丢失 | 主节点传送一个大 key → 复制延迟 |
❗ 造成 RDB / AOF 暴涨 | Dump 一次会卡死 |
❗ 影响单条命令性能 | 操作大 key 会变慢,例如 HGETALL |
大 key 识别方法:
-
使用
redis-cli --bigkeys
命令扫描实例 -
使用
redis-rdb-tools
分析 RDB 文件 -
通过慢查询日志 + 监控查看
HGETALL
、LRANGE
、SMEMBERS
的大 key
大 key 解决方案:
方案 | 说明 |
---|---|
✅ 拆分数据结构 | 如一个大 Hash 拆成多个小 Hash(按 ID) |
✅ 控制最大 field 数/元素数 | 控制单个结构体内成员 ≤ 10K |
✅ 禁用危险命令 | 比如关闭 KEYS , FLUSHALL , HGETALL |
✅ 延迟删除 / 慢删策略 | 例如将大 key 分批 UNLINK 删除 |
✅ 限制最大 value 大小 | 字符串不要超过几 KB,避免超过 MTU |
UNLINK vs DEL 的区别:
命令 | 说明 |
---|---|
DEL | 立即删除(阻塞线程) |
UNLINK | 异步删除,非阻塞 ✅ |
✅ Redis 4.0+ 建议用
UNLINK
删除大 key!
总结对比表
类型 | 触发方式 | 风险 | 解决方案核心 |
---|---|---|---|
热 key | 高频访问同一个 key | CPU 飙升、击穿、热点 | 本地缓存、分片、限流、预热 |
大 key | value 结构太大 | 慢查询、阻塞、同步问题 | 拆分结构、异步删除、结构约束、UNLINK |