Yihui’s Blog

分布式缓存如何实现一致性 Hash?相比普通 Hash 解决什么问题?

日期:2026-07-12
标签:#面试 #八股 #后端 #一致性Hash #分布式缓存 #负载均衡

一句话答案

将节点和 Key 映射到同一哈希环,Key 顺时针选择第一个节点;节点增删只影响相邻区间,虚拟节点用于改善负载均衡和支持权重。

面试口语版

普通 hash(key) % N 在 N 变化后几乎所有 Key 都重新映射,会导致缓存大面积失效。一致性 Hash 把哈希空间看成环,每个物理节点放多个虚拟节点,Key 哈希后顺时针找到第一个虚拟节点所属的物理机。新增节点只接管前驱到自身的区间,删除节点只把该区间交给后继,因此迁移比例约与变更节点容量相关。路由表用有序数组二分或 TreeMap 查找,节点列表通过版本化快照发布。

环形路由

flowchart LR
  A[Key哈希] --> B[有序环二分查找]
  B --> C[顺时针虚拟节点]
  C --> D[映射物理缓存节点]

关键细节

  • 虚拟节点数量越多分布越均匀,但路由表和迁移成本增加。
  • 异构节点按权重分配不同数量虚拟节点。
  • 节点切换时需双读、迁移或接受缓存未命中。
  • 热 Key 不会因一致性 Hash 自动拆散,仍需复制/分桶。

面试官追问

  1. 一致性 Hash 节点增删会迁移多少数据?
  2. 为什么需要虚拟节点?
  3. 如何处理热点 Key?

面试官追问参考答案

1. 一致性 Hash 节点增删会迁移多少数据?

理想均匀情况下新增第 N+1 个等容量节点约接管 1/(N+1) 的 Key,删除一个节点约迁移其 1/N 区间到后继。实际比例取决于虚拟节点分布和权重。

2. 为什么需要虚拟节点?

物理节点少时随机哈希点容易分布不均,虚拟节点把每台机器散布到环上多个位置,使负载和迁移更平滑;还可通过虚拟节点数量表达容量权重。

3. 如何处理热点 Key?

对只读热点做本地缓存或多副本并随机读,写热点可分桶/分片聚合,必要时请求合并和限流。一致性 Hash 只决定单 Key 去哪,不会拆分该 Key 的流量。

学习清单

  • 会解释 Hash 环和虚拟节点。
  • 理解迁移范围与热点局限。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts

设计 API 网关要考虑哪些功能?如何实现动态路由和限流?

日期:2026-07-12 标签:#面试 #八股 #后端 #API网关 #微服务 #限流 #系统设计 一句话答案 API 网关是统一流量入口,负责路由、认证、限流、协议转换、灰度、观测和安全;控制面管理动态配置,数据面使用不可变快照高速匹配并本地执行限流。 面试口语版 我会拆成控制面和数据面。控制面维护路由、服务…

Read article

配置中心挂了,微服务如何保证可用?

日期:2026-07-12 标签:#面试 #八股 #后端 #配置中心 #微服务 #高可用 一句话答案 数据面不依赖配置中心实时在线:服务使用内存中的最后有效配置和本地持久快照继续运行,启动策略按配置风险分级,并限制过期时间、告警和变更操作。 面试口语版 客户端每次成功获取配置都保存带版本、校验和和时间的本地快照。…

Read article