一致性哈希和取模哈希

一致性哈希(Consistent Hashing)和取模哈希(Modulo Hashing)经常被放在一起比较,尤其是在 分布式缓存 / 分布式存储 / 负载均衡 场景下。

一、取模哈希的特点

公式:

node = hash(key) % N
  • 优点

    • 实现简单,计算效率高。
    • 只要节点数 N 固定,映射关系稳定。
  • 缺点

    • 节点数 N 变化时(增减机器),几乎所有 key 的映射都要重新计算。
    • 导致 大规模缓存失效数据迁移成本高

举个例子:

  • 原来有 4 台缓存,key=100 落在 hash(100) % 4 = 0
  • 新增一台变成 5 台:hash(100) % 5 = 3
  • 结果 key 被重新分配,几乎所有数据都要迁移。

二、一致性哈希的特点

原理

  • 将哈希空间(0 ~ 2^32-1)首尾相连,形成一个环。
  • 节点通过 hash(node) 映射到环上。
  • key 通过 hash(key) 映射到环上,从该位置顺时针找到的第一个节点就是它的归属。

优点

  1. 节点增减影响小

    • 只会影响环上相邻一部分 key 的归属,而不是所有 key。
    • 极大减少了数据迁移量。
    • 例如新增一个节点,只会接收原来某个区间的 key。
  2. 负载更均衡(配合虚拟节点)

    • 给每个节点分配多个虚拟节点,打散在环上,避免热点集中。
    • 这样 key 更均匀分布在各个节点上。

缺点

  • 实现复杂度比取模高。
  • 查找时需要额外的数据结构(如有序环、红黑树)支持。
  • 如果没有虚拟节点,分布可能不均匀。

三、对比总结

对比点取模哈希一致性哈希
实现复杂度简单相对复杂(需环/虚拟节点)
节点变更时数据迁移大规模迁移仅局部迁移
负载均衡均匀(N 固定时)需配合虚拟节点,效果更好
适用场景节点数固定的集群节点数经常变动的分布式系统

四、典型应用

  • 取模哈希:适合节点数量固定、几乎不变的场景(如数据库分表,固定 64 张表)。

  • 一致性哈希:适合动态集群(缓存、分布式存储、分布式队列),如:

    • Redis 集群(部分实现)
    • 分布式缓存(Memcached、Ehcache 集群)
    • 分布式消息队列分区路由
    • Nginx / LVS 负载均衡

结论
节点数可能变动 的分布式系统里,一致性哈希比取模更优,因为它能显著减少数据迁移,保证系统稳定性。
但如果 节点数固定(例如数据库分表),取模哈希更简单直接,性能也更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值