当前位置: 首页 > news >正文

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

数据结构——一致性哈希+虚拟节点  布隆过滤器

目录

一、一致性哈希+虚拟节点

1.1 普通哈希

1.2 普通哈希算法缺陷

1.3 一致性哈希算法

二、布隆过滤器

原理

特点


一、一致性哈希+虚拟节点

1.1 普通哈希

我们有三台缓存服务器,用于缓存图片我们为这三台缓存服务器编号为 0号、1号、2号,现在有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力。也就是说,我们希望每台服务器能够缓存1万张左右的图片,那么我们应该怎样做呢?常见的做法是对缓存项的键进行哈希,将hash后的结果对缓存服务器的数量进行取模操作,通过取模后的结果,决定缓存项将会缓存在哪一台服务器上

当我们对同一个图片名称做相同的哈希计算时,得出的结果应该是不变的,如果我们有3台服务器,使用哈希后的结果对3求余,那么余数一定是0、1或者2;如果求余的结果为0, 就把当前图片缓存在0号服务器上,如果余数为1,就缓存在1号服务器上,以此类推;同理,当我们访问任意图片时,只要再次对图片名称进行上述运算,即可得出图片应该存放在哪一台缓存服务器上,我们只要在这一台服务器上查找图片即可,如果图片在对应的服务器上不存在,则证明对应的图片没有被缓存,也不用再去遍历其他缓存服务器了,通过这样的方法,即可将3万张图片随机的分布到3台缓存服务器上了,而且下次访问某张图片时,直接能够判断出该图片应该存在于哪台缓存服务器上,我们暂时称上述算法为 HASH 算法或者取模算法,取模算法的过程可以用下图表示:

1.2 普通哈希算法缺陷

上述HASH算法时,会出现一些缺陷:如果服务器已经不能满足缓存需求,就需要增加服务器数量,假设我们增加了一台缓存服务器,此时如果仍然使用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同,因为除数由3变为了4,最终导致所有缓存的位置都要发生改变,也就是说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据;同理,假设突然有一台缓存服务器出现了故障,那么我们则需要将故障机器移除,那么缓存服务器数量从3台变为2台,同样会导致大量缓存在同一时间失效,造成了缓存的雪崩,后端服务器将会承受巨大的压力,整个系统很有可能被压垮。为了解决这种情况,就有了一致性哈希算法

1.3 一致性哈希算法

是一种特殊的哈希算法,目的是解决分布缓存问题。在移除或添加一个服务器时,能够尽可能小的改变已存在的服务请求雪处理请求服务器之间的映射关系。一致性哈希算法解决了简单哈希算法在分布式哈希表中存在的动态伸缩关系。

假设圆上有2^32个点,意思就是有32个0/1位。哈希算法=数据的关键码%2^32通过计算得到它将落到哪个服务器上(落到圆耳朵哪一个点上),然后顺时针向后走,遇到的第一台服务器就是它存放的服务器

 

在圆上加一个服务器,因为我是对2^32取模所以受到影响的数据范围只有A->D这条弧线上的数据

在圆上减一台服务器, 受到影响范围只有A->B这条弧线上的数据

实际应用中,服务器可能分布的不会那么均匀,可能长这个样子,容易出现数据偏斜。因为A服务器承担压力太大,B/C服务器行能浪费了

二、布隆过滤器

原理

布隆过滤器由一个二进制位数组和多个独立的哈希函数组成。其核心原理如下:

  1. 添加元素当一个元素被加入集合时,通过多个哈希函数将该元素映射到位数组中的多个位置,并将这些位置的值置为1

  2. 查询元素:查询时,使用相同的哈希函数计算该元素对应的位置。如果这些位置的值均为1,则认为该元素可能存在于集合中;如果任何一个位置的值为0,则该元素一定不存在

特点

  • 空间效率高:布隆过滤器使用固定大小的位数组,每个元素仅占用1个bit,相比传统数据结构,如哈希表等,节省大量内存。

  • 查询高效:判断元素是否存在的时间复杂度为O(k),其中k是哈希函数的数量。

  • 误报可能性:布隆过滤器可能会错误地判断某个元素存在(假阳性),但绝不会误判某个元素不存在。

  • 不可删除:一旦元素被加入,无法直接从布隆过滤器中删除。

布隆过滤器==一个非常的二进制矢量数组+一组哈希函数

相关文章:

  • 【JVM】运行时数据区域
  • Linux:进程理解1(查看进程,创造进程,进程状态)
  • 【区块链安全 | 第四十篇】合约审计之delegatecall(二)
  • jquery.uploadifive.js上传文件 请求标头中添加参数
  • 数据结构(JAVA)队列
  • 使用Vscode排除一些子文件搜索
  • 掌握 Git 的十大基础命令
  • 五分钟了解智能体
  • node从14升级到22,vue2项目调整内容
  • EtherCAT从站错误0x001D调试指南
  • Python杨辉三角形
  • 71.case语句要比if-else 语句费逻辑单元
  • Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试
  • 20250412 机器学习ML -(3)数据降维(scikitlearn)
  • 软件设计师综合知识点总结(根据 教材+视频+刷题 总结整理)
  • Linux基础13
  • 【Flink运行时架构】作业提交流程
  • Java如何获取文件的编码格式?
  • Leedcode刷题 | Day31_贪心算法05
  • x-cmd install | yr - 告别网页!在终端轻松掌控天气预报
  • wordpress使用/seo
  • 建站公司网站建设/英文网站seo
  • 石龙仿做网站/提高工作效率心得体会
  • 中国互联网协会官网/宁波seo营销平台
  • 朝阳网站建设多少钱/百度一下就知道首页
  • 就业seo好还是sem/厦门谷歌seo