[TOC] #### 1. 前言 --- Redis 线上出问题,很多时候不是配置问题,是数据问题 一个 key 存了几 MB 甚至上百 MB 的数据,操作它的时候会卡住整个 Redis,这就是大 Key #### 2. 什么是大 Key --- String 类型 value 超过 10KB Hash、Set、ZSet、List 元素超过 5000 个,或总大小超过 10MB 听起来门槛不高?但业务跑久了,很容易不知不觉攒出大 Key #### 3. 大 Key 的危害 --- Redis 是单线程的,操作一个大 Key 耗时长,其它所有请求都得等 就像餐厅只有一个厨师,一个顾客点了 1000 道菜,后面所有人都等着 还有: + 网络带宽被大 Key 传输占用,影响其他请求 + Cluster 模式下,大 Key 所在节点内存压力大,数据不均衡 + 持久化时大 Key 序列化耗时长,bgsave 卡顿 #### 4. 怎么发现大 Key --- 扫描整个 Redis,找出每种类型最大的 Key,生产环境在从节点上跑,别影响主节点 ```plaintext redis-cli --bigkeys ``` 更精确的(按内存占用排序): ```plaintext redis-cli --memkeys ``` #### 5. 怎么解决 --- 拆分:大 Hash 按字段拆成多个小 Hash 压缩:大 String 可以先压缩再存 异步删除:Redis 4.0+ 用 UNLINK 替代 DEL,不阻塞主线程 分批遍历:别 hgetall 大 Hash,用 hscan 分批取 #### 6. 本文小结 --- 小总结: + String > 10KB,集合 > 5000 个元素就算大 Key + 阻塞请求、占带宽、内存不均、持久化卡顿 + redis-cli --bigkeys 发现大 Key + 拆分、压缩、UNLINK 异步删除、hscan 分批遍历