现象

  • 某个 key QPS 极高,单分片 CPU 打满。
  • 网络带宽与复制延迟在高峰突增。
  • 迁移 slot 时业务抖动明显。

治理步骤

  1. 识别热点:按 key 维度打 sampling 访问日志。
  2. 评估可分片性:是否支持合并读、是否有排序依赖。
  3. 设计散列方案:hotkey:{uid}:N

Go 读写示例

func shardKey(base string, uid int64, shards int) string {
    return fmt.Sprintf("%s:%d", base, uid%int64(shards))
}
  • 写:按 shard 分散。
  • 读:并发读取后聚合,必要时加本地短缓存。

额外策略

  • 热点结果做二级缓存(进程内 + Redis)。
  • 高峰期提前预热,避免瞬时击穿。
  • 为热点接口配置独立限流与熔断。

小结

热点 key 的本质是负载不均。先把流量摊平,再谈更复杂的缓存一致性优化。