一致性hash算法

一致性hash算法(数据均匀分布到各个节点上)

  • 普通hash算法的缺点:普通的hash算法将key的hash值对redis实例的个数进行取模,来定位到redis,这样会有一些问题,比如redis实例增加,这个计算公式就会变,于是要将之前存储的key重新hash一遍,这样代价是比较高的。

  • 一致性hash算法也是使用取模的方法,不过不是对服务器数量取模,而是对2的32次方取模,hash函数的值空间为0~2的32次方-1,将整个hash值空间看成一个虚拟的圆环。将每台服务器(ip地址)都hash到hash环的一个位置上。要添加key时,将key对2的32次方取模,确定在环上的位置,沿着环顺时针查找,遇到的第一个服务器就是要定位到的服务器。假如有一台服务器宕机了,只会影响这台服务器和它前面一台服务器中之间的数据,将这些数据重新进行定位即可。如果新增一台服务器,也只需要重新定位一小部分数据,一致性hash算法具有很好的扩展性和容错性。

  • 一致性hash算法的问题:数据倾斜问题。假设服务器在hash环上分布不均匀,就会导致大部分的数据定位到一台服务器上。

  • 解决:为了解决数据倾斜问题,引入了虚拟节点机制,对每一个服务器节点计算多个hash,每个计算结果的位置都放置一个此服务节点,称为虚拟节点。这样在服务器节点很少的情况下,也能做到数据的平均分布。

redis没有使用一致性hash算法,而是采用的自己的哈希槽计算方式

  • 原因:Redis的作者认为对key使用crc16算法,再将结果对16384进行取模(crc16(key) mod 16384 )效果已经可以了,而且实现很简单,对节点进行增加和删除时也很方便。比如有A、B、C三个节点,想添加一个D节点,只需要将一些哈希槽从A、B、C移到D即可。对于ABC三个节点,如果想删除A节点,只需要将A中的哈希槽移到B和C即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值