哈希的应用拓展(一致性哈希,虚拟节点,布隆过滤器)

哈希的应用拓展(一致性哈希,虚拟节点,布隆过滤器)

一、一致性哈希(解决分布式缓存的问题)

case1

	一个公司有三台服务器(A,B,C),假设有6W张照片,则可以根据哈希:**将每张照片的关键字提取出来 % 服务器数量(3)**
	可以很轻松的得到:%3 只有3种结果
			0:默认A服务器
			1:默认B服务器
			2:默认C服务器

在这里插入图片描述

Example:
	关键字为1000的照片的存储位置:1000 % 3 == 1  --> B(将这张照片放到B服务器上)
	关键字为12345的照片的存储位置:12345 % 3 == 0  --> A(将这张照片放到A服务器上)

case2

假设现在有一台服务器坏了(B),那么我现在还是需要查找这张照片是否存在于服务器上(该照片的关键字是123456),公司怎么响应?
    1.插入
        本来 x MOD 3,但是少一个服务器,就不能是MOD3
        所以,x MOD 2
    2.查找以前的照片
        如果一堆数据是按照 MOD 3的规则往服务器存储,则也只能 MOD 3来进行查找
        把所有数据取出来,MOD 2存放至两个服务器;也就是说少一台服务器,所有的数据会受到影响

case2

假设公司加大投资力度,多买了一台服务区,怎么办?
    1.多一台服务器(D),会对原先的服务器造成影响,究竟是MOD 3还是MOD 4
        如果是MOD 3,D服务器没有使用;而且后来的数据存储到哪里,所以后续数据肯定是 MOD 4;但是之前的数据如何?

所以,不管是多一台服务器还是少一台,都会对以前的数据造成影响,需要把原先的数据拿出来,重新插入数据

一致性哈希

	以上两种问题,可以用一致性哈希算法来解决。
	一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。
引例

在这里插入图片描述

一个圆的周边(周围)由无数个点组成,假设在这个圆上均匀分布2^32个点。
每一个点按照0~2^32-1这个顺序编号地址。
可以得知32个0/1(二进制)可以表示任何一个地址,假设每一台服务器的ip地址,对应到圆上的点时,就是ABC这三个点。现在还是这6W张照片,应该怎么存储?
	
提取每一张照片的关键字 MOD 2^32;其结果肯定会落在这个圆的任意一点上;如果落在圆弧上,则顺时针向后走,遇到的第一台服务器,就是存储他的服务器。
case1

在这里插入图片描述

加入服务器C受损,会不会还是所有的数据受到影响?
肯定不会。(在这种情况下,仅有1/3的数据受到影响)
因为:A-->B这个弧上,本身存储到B上,现在还是存储到B上(不影响)
		   B-->C这个弧上,本身存储到C上,现在是存储到A上(影响)
		  C-->A这个弧上,本身存储到A上,现在还是存储到A上(不影响)
假设有100台服务器,现在有一台服务器坏了,预估只有1/100的数据会受到影响。然而,这只是理想情况,实际上,
可能会出现**哈希倾斜**这种情况的诞生(服务器分布不匀)

在这里插入图片描述
在这种情况下,如果服务器A受损,则被影响的数据将会占据很大的比例。

二、虚拟节点

为解决上述服务器分配不匀的情况,可以在一致性哈希种引入虚拟节点。
现有ABC三台服务器,分别一人虚拟三个分身:
	A:A1,A2,A3
	B:B1,B2,B3
	C:C1,C2,C3
	(注意,所有的服务器中只有ABC才是真服务器)

在这里插入图片描述

可以发现,一致性哈希和虚拟节点结合起来会使得服务器的节点个数增加,而服务器的数量越多,越难出现哈希倾斜。
值得注意的是,在处理虚拟服务器时,可以这样认为:遇到分身(虚拟服务器),则认为遇到真人(A或B或C)。
假如遇到B3,则认为遇到了B服务器,所以C2-->B3这个弧上,最终数据存储到B服务器。

三、布隆过滤器(处理海量数据)

假设现在有10E的数字,而且还不重复,现在需要判断一个值x是否存在于这10E个数字中。
假如这10E个数据有序,则可以使用二分查找。但是现在数据是无序的,则可以使用布隆过滤器来查找。
布隆过滤器 = 一组非常长的二进制数组 + 一组哈希数函数

每一个
其中,每一个格子是一个位,而8位==1字节

在本例中,假设有三个哈希函数A,B,C。
 1. 第一个数字是100.
 2. 第二个数字是200
 3. 第三个数字是300
 4. 计算其他数据
 将所有数据全部算出来后,将对应的格子里面的值修改为1,如果格子本身对应的值就是1,那么就不用管。

将所有数据处理完之后,可以看到:
在这里插入图片描述

现在,所有的数据都通过这一组哈希函数计算之后,将对应的下标格子里面的值修改为了1,假设现在要判断值y是否存在于这10E个海量数据中,则可以进行如下的操作:

在这里插入图片描述

现在直接去看这个二进制数组
例如:y1 = 250;如果250存在,则下标4,1,0,肯定都是1(绝对);但是1和4的下标对应的值不是1,而是0.这时,可以判断250肯定是不存在于其中的。
	  y2 = 350;如果350存在,则下标3,5,6对应的值全部都是1。
	  现在,这三个位置都是1,但是可以100%确定350肯定存在于数据中吗?
答案是否定的,如果三个位置都是1,
 1. 则不能断定他100%存在,因为可能这三个位置由其他的数复制了。
 2. 也不能断定他100%不在,因为这三个位置都是1,就是因为350存在导致的。

布隆过滤器总结

特点:
	  他如果说一个值不存在,则这个值100%不存在。
	  但是他如果说一个值存在,则这个值不一定存在(有可能在,也有可能不在)
优点: 
	1. 占用的空间小,二进制数组大概700W(700W位 == 87500字节 == 854KB == 0.83MB)。
	2. 插入效率高,根据一组哈希函数进行计算,将对应的小标格子赋值为1.、
	3. 安全,布隆过滤器本身不存储原始数据,只存储其特征值。
缺点:
    1. 会发生误判(如果判断一个值存在,说明不一定在;但是说不在,就一定不在)
    2. 无法删除数据

END!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值