直接回答

大 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 前先压缩或拆分。