在分布式缓存系统中, 如何把数据映射到不同的缓存服务器上,一般会采用hash算法,如共有3台缓存服务器时, h= Hash(key)%3, 这种hash算法的扩展性和容错性不好,当业务增长需要加入新的缓存服务器或者由于某台缓存服务器出现故障,无法使用时,hash的计算将变为:h = Hash(key)%n ,这时,大量的访问将会因为缓存失效,而直接请求数据库,造成数据的负担。

   一致性hash的提出即为解决这样的情况。

一致性hash将整个hash值空间看作一个环形结构,如图所示,假设hash值空间为32位整数。

一致性hash redis 一致性hash原理_一致性hash redis

按照顺时针排列,0和2^32-1 重合。

然后将三台缓存服务器映射到换上,映射的关键字可以选用机器ip或者机器名,得到下图:

一致性hash redis 一致性hash原理_数据_02

然后,将数据key使用相同的函数H计算出哈希值h,通根据h确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。如下图所示:

一致性hash redis 一致性hash原理_一致性hash redis_03

其中,A 映射到server1 上,D映射到server3 上,B和C 映射到server2 上。

假设有新的机器server4加入缓存集群中,计算server4的hash值,并映射到环中。如下图:

一致性hash redis 一致性hash原理_一致性hash redis_04

这时,只需改变B的映射关系到server4中即可,其它的都不发生改变。

同理,当从集群中移除某台机器时,只需改变该机器与其逆时针方向上前一个机器之间的数据映射即可。无需对所有数据重新映射。

以上就是一致性hash算法的基础原理。