Skip to content

Latest commit

 

History

History
145 lines (96 loc) · 4.07 KB

File metadata and controls

145 lines (96 loc) · 4.07 KB

Redis大Key问题 学习总结

学习主题: Redis大Key问题 学习时间: 2026-05-05 测评得分: 40/100


学习过程回顾

Phase 1:知识简报

通过 4 步搜索(什么是大Key → vs对比 → 面试题 → 最佳实践),整理出核心知识简报:

大Key定义:

  • String 类型:value ≥ 10MB
  • Hash/Set/ZSet:成员数 ≥ 10,000

四大危害:

  1. 内存不均 → RDB/AOF写入卡顿
  2. 主线程阻塞 → DEL删除卡顿
  3. 带宽放大 → 一次读取传大量数据
  4. 持久化风险 → BGREWRITEAOF/BGSAVE变慢

Phase 2:交互答疑

用户未进行追问,直接进入测评阶段。


Phase 3:测评检验

测评结果: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命令阻塞主线程的具体后果

Phase 4:生成笔记

已保存到 ~/quick-study/2026-05-05-Redis大key问题.md


一、基础知识

1. 什么是大Key

Redis中单个键值对过大的数据叫"大Key"。常见判定阈值:

类型 大Key阈值
String value ≥ 10MB
Hash/Set/ZSet 成员数 ≥ 10,000

2. 大Key的危害(核心)

  • 内存不均:RDB/AOF写入卡顿,主从同步阻塞
  • 阻塞主线程:删除/过期时Redis主线程被拖慢
  • 带宽放大:一次读取传输大量数据,撑爆带宽
  • 持久化风险BGREWRITEAOFBGSAVE fork失败或变慢

3. 典型场景

  • 大Hash存用户全量信息(50万+字段)
  • 大String存文件内容
  • 大ZSet存全服排行榜

4. 一句话总结

大Key的本质是主线程阻塞风险,解决思路是拆分+异步删除+避免全量读取


二、常见问题QA

Q: 删除大Key用 DEL 还是 UNLINK?

  • DEL:同步阻塞,删除期间主线程不可用
  • UNLINK:异步非阻塞,立即返回,后台线程删除
  • 结论:生产环境优先用 UNLINK

Q: 为什么要避免 KEYS 命令?

  • KEYS全库遍历匹配,时间复杂度 O(N)
  • 在大key场景下会阻塞主线程数秒甚至更长
  • 生产环境禁止使用,应换用 SCAN 游标

Q: 线上发现大Key导致内存飙升怎么办?

  1. 定位:用 redis-cli --bigkeysMEMORY USAGE key 定位
  2. 评估:判断类型和大小,评估业务影响
  3. 短期:内存紧张 + 业务可接受 → UNLINK;业务不可接受 → 先扩容/迁移
  4. 长期:设计分桶方案,历史数据归档压缩
  5. 预防:接入大Key监控告警

三、使用与最佳实践

解决大Key的5种方案

方案 适用场景 说明
分桶 大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阻塞主线程的具体后果

五、参考链接