直接回答
大 key 指单个 key 占用的内存过大(如 String 超过几十 KB、集合类元素几十万上百万);热 key 指某个 key 被极高频访问,导致所在节点 CPU/带宽被打满。两者都会造成节点负载不均、慢查询甚至阻塞。
展开解析
危害:大 key 读写耗时、DEL 阻塞主线程、迁移和持久化慢、集群中造成数据倾斜;热 key 让单节点流量远超其他节点,分片失去意义。
发现手段:
- redis-cli 的 --bigkeys / --memkeys 扫描各类型的最大 key;
- RDB 文件离线分析(如 rdbtools),不影响线上;
- MONITOR 或采样统计找热 key;4.0+ 可用 hotkeys 参数(需 LFU 策略)配合 OBJECT FREQ;
- 监控系统按 key 前缀统计 QPS 和大小。
处理方式:
- 大 key:拆——把大 Hash/List 拆成多个小 key(如 user:1:tags:0~99);删——用 UNLINK 代替 DEL 异步释放;实在不需要就压缩或换存储。
- 热 key:本地缓存(Caffeine 挡一层,注意一致性窗口);key 拆散——复制成 N 份(hotkey:1~N)客户端随机读,写时全量更新;读写分离——从节点分担读流量。
预防优于治理:上线前评审 key 设计,预估元素数量级,大对象序列化后进 Redis 前先压缩或拆分。