背景
有A份数据,B个存储桶,怎么在A和B之间 建立较好的映射关系?且便于后续的查询,以及逻辑变更
- 存储桶个数可能增加,可能减少
- 希望已经分配到桶中的数据少进行迁移,即影响越小越好
- 传统的A_id.hash() % / B.size() 方案,会导致B大小变化后,A的映射的桶,剧烈变化
- 怎么解决这个问题呢,一致性哈希算法应运而生
- guava中有一致性哈希的实现
int i = Hashing.consistentHash(HashCode.fromInt(2324), 10);
缺陷
- 容易产生数据倾斜问题,如果桶很少,且桶分布不均匀
- 解决:虚拟节点的引入