这个库提供了一个一致的哈希函数,它同时实现了一致性和一致性。
关于这个概念的详细信息,您应该查看以下资源 :

Overview

在这个包的上下文中,键分布在分区之间,分区也分布在成员之间。

当你创建一个新的一致实例或调用Add/Remove:

  • 成员名被散列并插入到散列环中,
  • 平均负荷由本文定义的算法计算,
  • 分区通过散列分区id分布在成员之间,它们都不会超过平均负载。

不能超过平均负载。因此,如果在尝试添加新成员时,所有成员都以最大加载量加载,它就会恐慌。

当你想通过调用LocateKey来定位一个键时:

  • 键(字节片)被哈希,
  • 哈希的结果是mod分区的数量,
  • 这个模的结果- MOD(哈希结果,分区计数)-是键将位于的分区
  • 在调用LocateKey之前,分区的所有者已经确定。因此它立即返回分区所有者。

没有内存是由一致分配的,除非当你想要定位一个键时哈希。

注意,创建后不能更改分区的数量。

Install

使用正确配置的Go环境:
go get github.com/buraksezer/consistent

你会在examples文件夹中找到一些有用的用法示例。

Configuration

  1. type Config struct {
  2. // Hasher is responsible for generating unsigned, 64 bit hash of provided byte slice.
  3. //哈希器负责生成所提供的字节片的无符号64位哈希
  4. Hasher Hasher
  5. // Keys are distributed among partitions. Prime numbers are good to
  6. // distribute keys uniformly. Select a big PartitionCount if you have
  7. // too many keys.
  8. //键分布在分区之间。 质数对于均匀分配密钥是很好的。 如果你有太多的键,选择一个大的PartitionCount。
  9. PartitionCount int
  10. // Members are replicated on consistent hash ring. This number controls
  11. // the number each member is replicated on the ring.
  12. //成员在一致的散列环上复制。 这个号码控制每个成员在环上复制的号码。
  13. ReplicationFactor int
  14. // Load is used to calculate average load. See the code, the paper and Google's
  15. // blog post to learn about it.
  16. //负载用于计算平均负载。 请参阅代码、论文和谷歌的博客文章来了解它。
  17. Load float64
  18. }

任何哈希算法都可以用作实现哈希接口的哈希器。请查看示例部分的示例。

Usage

LocateKey函数在集群中为你的key找到一个成员:

  1. // With a properly configured and initialized consistent instance
  2. // 使用正确配置和初始化的一致实例
  3. key := []byte("my-key")
  4. member := c.LocateKey(key)

它返回您之前添加的成员的线程安全副本。

第二个最常用的函数是GetClosestN。

  1. // With a properly configured and initialized consistent instance
  2. key := []byte("my-key")
  3. members, err := c.GetClosestN(key, 2)

这可能有助于找到存储密钥的备份节点。