您的位置:首页 > 数据库 > Redis

redis等缓存相关的一致性hash算法

2014-09-16 10:48 295 查看
一致性哈希算法目前在缓存中用到的越来越广泛,比如说:redis

1应用场景:

假设目前有多台redis服务器,需要放到redis中的key值有多个,如何能让这些key值均匀的分布到这些redis服务器中,已达到充分利用redis服务器的目的,这就是一致性哈希出现的历史背景。

2一致性哈希原理:

在移除或者添加一个缓存的时候,需要尽可能小的改变已存在的key的映射关系。

2.1哈希环

通常计算hash值的算法是将值映射到一个32位的key值,也就是说是0到2^32-1次方范围内的值;我们可以将此想象成一个环(一个首为0,尾为2^32-1组成的环)。

2.2把对象映射到哈希环中

假设现在有4个key值,通过hash值计算后在哈希环中的分布如下(此处图略,大家可以想象一下,一个环状,hash值分布在这个环中)。

2.3把redis服务器映射到哈希环中

同样的道理,假设我们有四台redis服务器,同样的hash值算法,将四台redis服务器均匀的分部到哈希环中去(计算redis哈希值的算法,一般可以通过redis服务的IP或者服务器名来计算,redis就是通过IP计算的)。

2.4将key值映射到redis服务器上

现在对象或者key值,以及redis服务器已经都映射到哈希环中了;现在key值沿着环的顺时针方向,当遇到第一个redis服务器的时候,就把key值放到此服务器中,剩下的key值以同样的原理被均匀分散的放到了redis服务器中。

2.5redis服务器的变化

2.5.1移除redis服务器

现在考虑第二台redis服务器挂掉了,现在只需要变动第一台和第二台之前的key值,将其值放到第三台即可。

2.5.2添加redis服务器

现在添加一台redis服务器,位置正好处在key1和key2之间,此时受影响的是沿此服务器逆时针到上一台服务器中间的key,这些key值将会被放到这台新的redis服务器中,而且受影响的也仅有这些。

3虚拟节点

虚拟节点是为了解决平衡性的问题,例如,如果只有两台redis服务器,另外有四个key值,有可能出现四个key值都只是在一台redis服务器上,这样使得分布式很不平衡的,此时虚拟节点就是解决这个问题的。
这里以两台redis服务器举例,“复制个数”为2,此时就是有四个虚拟节点(A1,A2对应A,B1,B2对应B),此时平衡性就会有很大的提高。

参考:http://blog.csdn.net/sparkliang/article/details/5279393
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: