背景

有A份数据,B个存储桶,怎么在A和B之间 建立较好的映射关系?且便于后续的查询,以及逻辑变更

  • 存储桶个数可能增加,可能减少
  • 希望已经分配到桶中的数据少进行迁移,即影响越小越好
  • 传统的A_id.hash() % / B.size() 方案,会导致B大小变化后,A的映射的桶,剧烈变化
  • 怎么解决这个问题呢,一致性哈希算法应运而生
  • guava中有一致性哈希的实现
    1. int i = Hashing.consistentHash(HashCode.fromInt(2324), 10);

缺陷

  • 容易产生数据倾斜问题,如果桶很少,且桶分布不均匀
  • 解决:虚拟节点的引入

参考