作者回复: 带有限负载的一致性hash在存储时实际是分两步走,第一步通过一致性哈希计算出一个命中节点,如果命中节点有足够的空间,则存储在命中节点上,否则按顺时针方向,依次遍历下一个节点,直到找到下一个节点为止。
查询的时候如果按照存储的方式去计算命中节点,然后再去顺时针依次遍历下一个节点,这时你就会发现问题来了。
因为,如果查询数据不存在的话,需要遍历完整个哈希环上的所有节点。这种遍历的开销就太大了,因为这是网络上的遍历,可不是单机内存内的遍历。
一种思路是,在哈希命中节点上额外添加一个索引表,用以记录命中到该节点上的数据存储在哈希环上的位置。这样在通过一致性哈希计算出命中的节点后,只需要再查询这个节点上的索引表就可以找到实际的存储节点了。
其实这个本质上就是一个解决哈希冲突的过程,你可以再回想一下我们在数据结构中的哈希表解决冲突的方法,通过对比学习,可以更进一步加深你的理解。