Rendezvous哈希可以有效地添加节点吗



Rendezvous哈希的维基百科文章(https://en.wikipedia.org/wiki/Rendezvous_hashing)并没有解释将节点添加到哈希表时会发生什么。按照我的理解,如果你将一个节点添加到通过Rendezvous哈希实现的哈希表中,其他节点中可能有对象实际上应该映射到这个新节点,因为这些对象的哈希值高于这些对象当前所在节点的哈希值。为了解决这个问题,你需要扫描整个哈希表,重新计算哈希值,并在需要时移动对象。就性能而言,这是极其昂贵的。

我认为集合哈希有意义的唯一方法是哈希表充当缓存并由数据库支持。然后,如果节点没有对象,则可以从数据库中提取该对象。此外,如果一个节点有一个对象,但该对象的密钥不再映射到该节点,则该节点的缓存算法将驱逐它(通过LRU/LFU(。

我的理解正确吗?有办法解决这个问题吗?

好问题!维基百科的文章实际上触及了这个话题"如果一个对象已经在系统中。。。它将被重新获取并缓存";。

基本上,该算法的建议区域是可以缓存值的情况,但稍后可以重新缓存它。虽然它确实需要额外的处理,但实现本身非常简单。这种方法的一个真实例子是memcached——它使用这种确切的方法,不在乎是否添加/删除节点——现有密钥不会发生重新哈希。

另一个有趣的注意事项是关于Rendezvous和一致哈希的关系——一致哈希的目的是只移动一些键,即映射到新分区的键。在Rendezvous哈希的情况下,将移动相同数量的密钥;更好的是,平均每个现有节点都会提供相同百分比的密钥,但这是以必须重新处理所有密钥为代价的。

最新更新