从redis源码看一致性hash算法

前言

这两年redis技术越来越火爆,其超高的性能,简洁轻量的设计,非常容易上手,在缓存等领域表现的越来越出色。官方在Redis 3也正式推出了集群技术,不同于传统的散列映射的集群方案,jedis(redis的java客户端)支持Redis Sharding功能,结合缓存池ShardJedisPoo和一致性hash算法实现了高效hash。下面就结合redis的使用详细说说这个一致性hash算法。

转载请指明原处:http://blogs.xzchain.cn

1.什么是hash算法

开始之前有必要研究一下什么是哈希算法,百度百科上说:

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。

简单来说就是一种可以将任意长度的消息压缩到某一固定长度的消息摘要的函数

举个例子就是,比如我们现在要把一万个人进行排序,实现迅速判断某人在不在这一万个人当中,比如我们想找找张三在这个人群中吗,我们可以一个一个去问:“hello大哥,你是张三吗”,“不是”…“hello大哥,你是张三吗”,“不是”……这样总会问出来的,但是问的人会由于口干舌燥进了医院。这时候,如果我们采用哈希(散列)算法的思想,首先选择一个大房子,里面有一间一间小屋子(散列表),我们根据每个人的出生年月日+姓名+性别+其他信息进行散列(散列函数),将其分到不同的屋子里面。这样下次在找一个人的时候,只需要把他的信息用散列函数求出来(得到散列地址),然后去对应的房子就一定能找到他!

如何衡量hash算法优劣?

还是上面的例子,如果我们选取的散列函数很差劲(说明下,这里的散列和哈希其实是一个意思),最差的情况下,所有人都被分到了一个屋子里,那还散列个啥,回家吃饭吧。
所以好的哈希函数,应该具备以下几个特点:

  1. 碰撞率低:选取合适的散列函数,使所有数据可以均匀分布(平衡性),冲突的情况少
  2. 高性能:即散列函数的计算效率快
  3. 单调性:在散列表扩大的情况下,原先已经分配的数据尽量少的变动。
  4. 出现冲突时的解决办法是否优良

还是上面的例子,我们希望在分配的时候能把这一万人均匀分到不同的房间即低碰撞率,在计算每个人应该分的房间时要尽量快速,同时如果需要分配更多的人,比如又来了一万人,按原来的房间个数分配的话会有很多冲突,这时候需要增加房间个数,但对于之前已经分配好的一万人应尽量少的受影响,不然这一万人就白分了。

补充下:
常见的基本散列函数有:

  • 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数)
  • 数字分析法:分析一组数据,找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
  • 平方取中法:取关键字平方后的中间几位作为散列地址。
  • 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
  • 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。
  • 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m。

常见解决冲突的思路:

  • 开地址法:例如线程探查法等其他借用空间的方法,缺点是会出现堆积现象。存取时,可能不是同义词的词也位于探查序列,影响效率
  • 链地址法(拉链法):借助单链表实现冲突解决
  • 建立公共溢出区

常见的hash算法

  1. MD4
    MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest(消息摘要) 的缩写。它适用在32位字长的处理器上用高速软件实现——它是基于 32位操作数的位操作来实现的。
  2. MD5
    MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值