其他分享
首页 > 其他分享> > 海量数据去重的Hash和BloomFilter

海量数据去重的Hash和BloomFilter

作者:互联网

一、背景

需求

上面的需求都是从海量数据中查询某个字符串是否存在?

二、平衡二叉树

平衡二叉树的增删查改的时间复杂度为O(log2n);

平衡的目的是增删改后,保证下次搜索能文帝排除一半的数据;

O(log2n)的直观理解:100万个节点,最多比较 20 次;10亿个节点,最多比较 30 次;

总结:通过比较保证有序,通过每次排除一半的元素达到快速索引的目的;

三、散列表

散列表,使用hash函数,根据key计算key在存储表中的位置的数据结构;hash函数是key和其所在存储地址的映射关系。

hash函数

映射函数 Hash(key)=addr ;

hash 函数可能会把两个或两个以上的不同 key 映射到同一地址,这种情况称之为冲突(或者 hash 碰撞);

选择hash

siphash主要解决字符串接近的强随机分布性,当key比较接近时,哈希经过也会比较接近,它的随机分布性就会出现问题。

负载因子

数组存储元素的个数/数据长度;用来形容散列表的存储密度;负载因子越小,冲突越小;负载因子越大,冲突越大。

冲突处理

四、布隆过滤器

背景

布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在

布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删 除操作(见附2);

构成

位图(Bit数组)+n个hash函数

 

原理

当一个元素加入位图时,通过 k 个 hash 函数将这个元素映射到位图的 k 个点,并把它们置为 1; 当检索时,再通过 k 个 hash 函数运算检测位图的 k 个点是否都为 1;如果有不为 1 的点,那么认 为该 key 不存在;如果全部为 1,则可能存在;

1. 为什么不支持删除操作?

 

 应用场景

布隆过滤器通常用于判断某个 key 一定不存在的场景,同时允许判断存在时有误差的情况;

常见处理场景:① 缓存穿透的解决;② 热 key 限流;

 

应用分析

在实际应用中,该选择多少个 hash 函数?要分配多少空间的位图?预期存储多少元素?如何控制 误差? 公式如下:

假阳性指误差率,如0.01可以看作100个数据允许出现1个失败。

布隆过滤器的使用(见附3)

五、分布式一致性hash

分布式一致性hash可以用来解决分布式缓存的负载均衡(见附4)问题。

背景

在分布式环境下,我们会设置n服务器节点,我们使用hash(ip)%n得到服务器的编号,在插入数据时,我们使用hash(key)%n得到该数据要存储的服务器。此时,如果我们增加或删除服务器节点,则n发生改变,从而导致原有的服务器编号不适用。分布式一致性hash算法就是解决这个问题。

分布式一致性 hash 算法将哈希空间组织成一个虚拟的圆环,圆环的大小是232

算法为: hash(ip) ,最终会得到一个 [0, 232] 之间的一个无符号整型,这个整数代表 服务器的编号;多个服务器都通过这种方式在 hash 环上映射一个点来标识该服务器的位置;当用 户操作某个 key,通过同样的算法生成一个值,沿环顺时针定位某个服务器,那么该 key 就在该服务器中。

 

数据迁移

分布式一致性hash有效避免数据的全量迁移,需要迁移的只是更改的节点和它的上游节点它们两个节点之间的数据。

hash偏移

hash 算法得到的结果是随机的,不能保证服务器节点均匀分布在哈希环上;分布不均匀造成请求 访问不均匀,服务器承受的压力不均匀;

 

 

 虚拟节点

为了解决哈希偏移的问题,增加了虚拟节点的概念;理论上,哈希环上节点数越多,数据分布越均衡(hash的强随机分布性)。

为此,我们为每个服务器计算多个哈希点(虚拟节点),然后再插入哈希空间;

通常的做法是:hash("IP:PORT:seqno")%232。(seqno为自定义的偏移量)

 

 

-------------------------------------------------------------------------------------

附录

附1

散列表每个存储位置都可以转换成链表。而链表数据的插入分头插法和尾插法。数据库常使用头插法,因为数据库认为最近插入的元素,未来也是最先访问到的。

附2

布隆过滤器的不可删除是由于储存方式导致的,如果确实需要删除操作,可以使用两个布隆过滤器,第二个布隆过滤器存储删除的元素

附3

k我们常常会选择31,因为

  1.  i * 31 可以很方便的转换成位运算 i * (32-1) = i << 5 -1
  2.  比较常用的[17,31,101]中质数31的hash随机分布性是最好的

附4

常见的负载均衡方法有很多,但是它们的优缺点也都很明显:

标签:Hash,key,海量,链表,哈希,服务器,hash,BloomFilter,节点
来源: https://www.cnblogs.com/unrealCat/p/15953257.html