目录
1.一致性哈希
例如:有三个服务器A,B,C,而现在我们手中有6W张照片,那么怎么把这些照片分给三个服务器?方法为:提取图片的关键字 % 服务器个数(3)
假设,又新加了一台服务器D,这时会发生什么? 那之前的很多图片的位置都要发生改变
由于服务器数量发生改变,导致服务器中的数据受到影响(全部数据)
2.虚拟节点
上面只是一种理想的状态,几乎是达不到的。有时会出现哈希偏斜:
此时,就需要引入虚拟节点概念,虚拟节点:不存在的点,臆想出来的点
例如:A B C是真实的服务器,接着就把A,B,C分身(虚拟)——A: A1 A2 A3 ;B: B1 B2 B3 ;C:C1 C2 C3;
我们如果遇到了A1 A2 A3也就是A的分身,我们可以直接认为遇到了A本身
绿色弧,认为都是属于服务器A的部分,和之前的哈希偏斜相比,压力大大减少,接近于均分
3.布隆过滤器(海量数据去重)
例如:有10E个整型值,不重复,现在需要确定X存不存放在这10E个整型数内?
实际上,布隆过滤器就是一个非常长的二进制矢量 + 一组哈希函数
假设,现在有三个不同的哈希函数A, B, C
这是20个二进制位,要么存1,要么存0。
设100,200,300这三个数经过哈希函数A, B, C的分解后剩下的数字如图所示,我们把有的数字为值改为1:
再然后,需要判断一下250在不在这组数中,而我们知道250可以被A,B,C三个函数分解为:
分析一下:如果250存在,则3,9,19的格子里应该都是1,但是我们看到19这个格子并不是1,所以250是不存在的。
最后,判断一下50在不在这组数中,50可以被A,B,C三个函数分解为:
分析一下:50可以被A,B,C三个函数分解为6,9,15,而6,9,15这三个格子确实都是1,那么这个时候可以认定50一定在吗?显然是不能认定的,因为我们知道6对应格子的1是100或200的,9对应格子的1是100的,15对应格子的1是300的,所以不能得到50一定存在的结论。这就是布隆过滤器的一个缺点。
布隆过滤器的特点:他可以非常快速的告诉我们一个值存不存在,如果判定不存在是一定不存在,但是如果判定存在的话,不能保证,有可能不存在
布隆过滤器的优点:
1.占用空间小
2.插入,查找时间复杂度特别低
3.安全,布隆过滤器不存在存储原始数据本身,所以不害怕被盗。
布隆过滤器的缺点:
1.会发生误判(如果计算得到的位都是1,但是不能保证这个值真的存在)
2.删除根本办不到
误判率: 0.03 700W 5个
0.01 900W 7个
误判率降低 —— 导致二进制位占用空间增加 —— 导致需要的哈希函数增加