学习主题: Redis大Key问题 学习时间: 2026-05-05 测评得分: 40/100
通过 4 步搜索(什么是大Key → vs对比 → 面试题 → 最佳实践),整理出核心知识简报:
大Key定义:
- String 类型:value ≥ 10MB
- Hash/Set/ZSet:成员数 ≥ 10,000
四大危害:
- 内存不均 → RDB/AOF写入卡顿
- 主线程阻塞 → DEL删除卡顿
- 带宽放大 → 一次读取传大量数据
- 持久化风险 → BGREWRITEAOF/BGSAVE变慢
用户未进行追问,直接进入测评阶段。
测评结果:40/100
| 题号 | 题型 | 题目 | 答案 | 得分 |
|---|---|---|---|---|
| 1 | 选择题 | 哪种情况最可能触发大Key问题 | B(Hash 50,000字段) | 0/10 |
| 2 | 选择题 | 删除大Hash用DEL还是UNLINK | B(UNLINK) | 10/10 |
| 3 | 选择题 | 哪项不是解决大Key的有效方案 | C(MULTI/EXEC) | 0/10 |
| 4 | 简答题 | 线上内存飙升的排查解决思路 | 框架正确但缺具体命令 | 18/25 |
| 5 | 简答题 | 为什么要避免KEYS命令 | 回答过于简短 | 12/25 |
薄弱点:
- 大Key量化阈值(10MB / 10,000成员)
- UNLINK vs DEL 适用场景
- KEYS命令阻塞主线程的具体后果
已保存到 ~/quick-study/2026-05-05-Redis大key问题.md
Redis中单个键值对过大的数据叫"大Key"。常见判定阈值:
| 类型 | 大Key阈值 |
|---|---|
| String | value ≥ 10MB |
| Hash/Set/ZSet | 成员数 ≥ 10,000 |
- 内存不均:RDB/AOF写入卡顿,主从同步阻塞
- 阻塞主线程:删除/过期时Redis主线程被拖慢
- 带宽放大:一次读取传输大量数据,撑爆带宽
- 持久化风险:
BGREWRITEAOF、BGSAVEfork失败或变慢
- 大Hash存用户全量信息(50万+字段)
- 大String存文件内容
- 大ZSet存全服排行榜
大Key的本质是主线程阻塞风险,解决思路是拆分+异步删除+避免全量读取
DEL:同步阻塞,删除期间主线程不可用UNLINK:异步非阻塞,立即返回,后台线程删除- 结论:生产环境优先用
UNLINK
KEYS是全库遍历匹配,时间复杂度 O(N)- 在大key场景下会阻塞主线程数秒甚至更长
- 生产环境禁止使用,应换用
SCAN游标
- 定位:用
redis-cli --bigkeys或MEMORY USAGE key定位 - 评估:判断类型和大小,评估业务影响
- 短期:内存紧张 + 业务可接受 →
UNLINK;业务不可接受 → 先扩容/迁移 - 长期:设计分桶方案,历史数据归档压缩
- 预防:接入大Key监控告警
| 方案 | 适用场景 | 说明 |
|---|---|---|
| 分桶 | 大Hash | 按ID分桶 user:{id % N} |
| 压缩 | 大String | gzip/msgpack压缩value |
| UNLINK | 删除操作 | 异步删除,不阻塞主线程 |
| SCAN | 读取操作 | 游标分批,避免全量读取 |
| 过期时间 | 历史数据 | 设置TTL,定期自动清理 |
- 上线前用
redis-cli --bigkeys扫描 - 接入 Redis 监控告警(内存使用率、大Key告警阈值)
- Code Review 时注意单key数据量评估
| 题号 | 错因 |
|---|---|
| 第1题 | 未记住Hash类型大key的量化阈值(10,000成员) |
| 第3题 | 不清楚MULTI/EXEC事务的真正用途 |
| 第5题 | 未展开KEYS阻塞主线程的具体后果 |
- Redis官方文档:https://redis.io/docs/
- Redis大Key最佳实践:https://redis.io/docs/management/optimization/