高 进阶
大Key问题与解决#
一句话答案#
大 Key(String>10KB/集合>5000 元素)阻塞主线程,发现用 —bigkeys,解决:拆分/压缩/UNLINK 异步删除。
核心要点
发现: redis-cli --bigkeys / MEMORY USAGE key
解决:
- 拆分:Hash 分片 / List 分段
- 压缩:序列化压缩
- 删除:UNLINK(异步删除,不阻塞)
预防: 设计时控制 Value 大小和集合元素数量
面试回答(2分钟版)
大 Key 是指单个 Key 的 Value 过大,通常 String 超过 10KB 或集合类型超过 5000 个元素就算大 Key。大 Key 的危害主要有两方面:一是操作耗时长会阻塞 Redis 单线程,导致其他请求排队超时;二是在 Cluster 架构下造成数据倾斜,某个节点内存和流量远高于其他节点。发现大 Key 可以用 redis-cli —bigkeys 扫描或者对单个 Key 执行 MEMORY USAGE 查看实际内存占用。解决方案有三种:拆分是最根本的,比如大 Hash 按字段分片成多个小 Hash,大 List 按范围分段;压缩是在序列化时用 snappy 或 gzip 减小体积;删除大 Key 一定要用 UNLINK 而不是 DEL,UNLINK 是异步删除不阻塞主线程,DEL 同步删除大 Key 可能导致几秒的阻塞。预防上从设计阶段就要控制 Value 大小和集合元素数量。
追问与易错
追问方向:
- “大 Key 对 Cluster 影响?”→ 大 Key 固定在一个 slot 上,导致该节点内存和流量远高于其他节点(数据倾斜);操作大 Key 阻塞主线程影响该节点上所有 slot 的请求,迁移 slot 时大 Key 也会拖慢迁移速度
- “UNLINK 和 DEL 区别?”→ DEL 同步删除,大 Key(如百万元素的 Hash)删除时阻塞主线程可能长达数秒;UNLINK 是 Redis 4.0+ 的异步删除命令,主线程仅解除 key 引用,实际内存回收由后台线程完成不阻塞
- “怎么预防大 Key?”→ 设计阶段限制 value 大小(String 控制在 10KB 以内)和集合元素数量(不超过 5000);业务上大集合按 Hash 分片存储;上线前 CR 检查 Redis 操作,定期用 —bigkeys 扫描巡检
易错点:
- ❌ 用 DEL 删大 Key——会阻塞,应用 UNLINK
- ❌ scan 出大 Key 就删——需评估影响