一致性哈希,虚拟节点,布隆过滤器

目录

1.一致性哈希

2.虚拟节点

3.布隆过滤器(海量数据去重)


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个

误判率降低 —— 导致二进制位占用空间增加 —— 导致需要的哈希函数增加

布隆过滤器是一种用于快速判断一个元素是否可能存在于一个集合中的数据结构。它可以通过牺牲一定的准确性来提高查询效率。布隆过滤器的主要应用之一就是解决数据一致性的问题。 在分布式系统中,数据一致性是一个重要的问题。当多个节点同时对数据进行更新时,可能会导致不同节点之间的数据不一致。为了解决这个问题,可以使用布隆过滤器来快速判断一个新的更新是否已经在其他节点上被处理过,从而避免重复处理。 具体来说,可以将每个节点维护一个布隆过滤器,用于记录已经处理过的更新。当一个节点接收到一个新的更新时,首先将更新的内容通过哈希函数映射到布隆过滤器中的位数组上,并将相应位置置为1。然后,节点可以查询其他节点布隆过滤器,判断该更新是否已经被其他节点处理过。 如果一个更新被多个节点同时接收到并处理,由于布隆过滤器的准确性有限,可能会存在误判的情况。这时可以通过其他机制来保证数据最终的一致性,比如使用分布式锁或者进行协调和同步。 总结起来,布隆过滤器可以在分布式系统中用于判断一个更新是否已经被其他节点处理过,从而解决数据一致性的问题。然而,布隆过滤器并不能保证完全的准确性,可能存在一定的误判率,需要结合其他机制来确保数据的最终一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值