布隆过滤器、哈希一致性

布隆过滤器、哈希一致性

一、布隆过滤器

<span>布隆过滤器、哈希一致性</span>

使用大的bitMap,存储哈希函数计算后的结果。

请求: 文件中有大量的key,此时请求一个key,判断是否在文件中。(如果允许失误率,使用布隆过滤器)

步骤:1. 使用k个hash函数计算key的hash值,再%m(bitMap的位数),将k个计算出的位置都填1。

​ 2.下次查询是否存在key时,经过k个hash函数计算出的k个值,查看bitMap中对应位置,如果都为1,则存在过,反之不存在。

但是有失误率P,

问题:不存在文件中的key,也会被误认为存在于文件。

​ (如果K值不合适,或者m值过小,则失误率就会上涨。)

下图为各个参数计算公式。

<span>布隆过滤器、哈希一致性</span>

二、哈希一致性

该算法的原理用一句话将就是:

将服务器节点分布到一个环上,必要时需要增加虚拟节点(映射到真实节点),查找的时候根据Hash算法定位到环上的某个点,然后再顺时针找到最近的一个可用的服务器节点。

解决问题

在使用分布式对数据进行存储时,经常会碰到需要新增节点来满足业务快速增长的需求。然而在新增节点时,如果处理不善会导致所有的数据重新分片,这对于某些系统来说可能是灾难性的。

作用:在新增或者减少服务器的时候,减小影响的范围。

原理

一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:

<span>布隆过滤器、哈希一致性</span>

  1. 首先求出memcached服务器(节点)的哈希值,并将其配置圆(continuum)上。
  2. 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
  3. 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。

但此时有问题

  1. 机器节点不一定分配均匀
  2. 增加或减少机器,负载就不均衡了

因此产生了虚拟节点技术来解决问题

虚拟节点

为机器分配字符串,此时不再用机器来抢环上的数据归属,而是使用字符串(机器的代表点)来抢占

如机器A:a1,a2,a3,…….a1000

​ B: b1,b2,b3,……b1000

​ C: c1,c2,c3,……..c1000

此时使用字符串(机器的代表点)来计算hash值来抢环

因为虚拟节点很多,所以在环上的任意区域,相当于均分了数据。如下图,任意区域都均分了虚拟节点,

此时如果增加机器,就给新增的节点D也分配很多字符串用来抢数据,最后一个区域均分4个机器的虚拟节点了。

此时就解决了机器节点不均匀分配和增加减少机器负载不均衡的问题了。

而且还额外的增添了一个功能,就是可以管理负载,如果A机器性能良好,就可以分配2000个虚拟节点,而D机器不好,就可以少分配一些节点,从而达到管理负载的效果。

<span>布隆过滤器、哈希一致性</span>

性质

平衡性(Balance)

平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

单调性(Monotonicity)

如果原本有一些服务器被分配了数据,此时有新的服务器加入,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的服务器中去,,而不会被映射到旧的服务器中。

平滑性(Smoothness)

平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致的。

分散性(Spread)

在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。

导致了相同内容被存储到不同缓冲中去,降低了系统存储的效率。

分散性的定义就是上述情况发生的严重程度。

好的哈希算法应能够尽量避免不一致

负载(Load)

负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115160.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安卓中activity的生命周期_activity生命周期调用顺序

    安卓中activity的生命周期_activity生命周期调用顺序前言很高兴遇见你~欢迎阅读我的文章。关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的。事实上,我猜测每个android开发者接触的第一个android组件都是Activity。我们从新建第一个Activity开始,运行了代码,看到模拟机上显示了一个MainActivity标题和一行HolleWorld,从此打开Android世界的大门。本篇文章讲解的重点是Activity的生命周期,在文章的最后也会涉及Activity的设计。不

    2022年8月16日
    5
  • python中的imread函数_python open函数参数

    python中的imread函数_python open函数参数cv2.imread()除了最常用的路径参数之外,第二个参数也至关重要:imread(conststring&filename,intflag=1)filename:需要打开图片的路径,可以是绝对路径或者相对路径,路径中不能出现中文。flag:图像的通道和色彩信息(默认值为1)。flag=-1,8位深度,原通道flag=0,8位深度,1通道f…

    2022年9月25日
    2
  • java 针对jvm的面试题_24个Jvm面试题总结及答案

    java 针对jvm的面试题_24个Jvm面试题总结及答案1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。2.Java内存结构?方法区和对是所有…

    2022年8月27日
    7
  • Java实现MD5算法

    Java实现MD5算法MD5算法工具类importjava.security.MessageDigest;/**加密工具**@author刘彦青***/publicclassEncryptUtil{ /**MD5加密 * *@paramjiami *源字符串 *@return加密后的字符串*/ publicfina…

    2022年7月9日
    18
  • google earth使用方法_国内使用google earth

    google earth使用方法_国内使用google earth文件 导入是最重要的功能,可以导入路径、图像、模型。 编辑 复制,如果选中路径对象将会复制为KML的XML语言文本。 复制为航迹,可以复制路径,但不清楚用途。 复制图像就是将当前窗口截屏。 复制视图位置会将当前的经纬度以度,分,秒的格式复制到剪贴板。 重命名是为除我的地点、临时位置不可用外,其余的都可以用。 快照视图是所有对象可用的,包括文件夹、地标、图像、路径、游览,只有在左侧窗格选中对象,这个功能才可以用。 按名称排

    2022年9月19日
    3
  • vscode 快捷键绑定

    vscode 快捷键绑定最近迷上了vscode,用它开发.netcore程序十分方便,智能提示也很好用,插入智能提示的选项是enter键或者tab键,可惜我以前习惯使用vs写c#,习惯用空格做智能提示的选择,多方查找资料甚至准备采用开发一个vscode插件的方式解决,后来无意间查看官方文档,利用vscode的快捷键绑定功能是可以做到的。打开vscode,进入文件->首选项->键盘快捷方式查看’tab’的功能,其中就有一项:

    2022年5月18日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号