【算法】BloomFilter概念和原理以及业务中的应用场景

news2025/1/6 18:47:18
思考:海量数据下去重,如果是非数值类型的话如何判断?

1.什么是布隆过滤器

  • 1970年由布隆提出的一种空间效率很高的概率型数据结构,它可以用于检索一个元素是否在一个集合中。

  • 由只存0或1的位数组和多个hash算法, 进行判断数据 【一定不存在或者可能存在的算法】。

  • 如果这些bit数组 有任何一个0,则被判定的元素一定不在; 如果都是1则被检元素很可能在

  • 对比bitmap位图,布隆过滤器适合更多类型元素,通过hash值转换

在这里插入图片描述

  • 原理

    • 将元素添加到一个bitmap数组中,每个散列函数将元素映射到bitmap数组中的一个位置

    • 如果该位置已经被占用,则将该位置置为1,否则置为0

    • 当要查询一个元素是否存在时,只需要计算该元素的散列值,并检查bitmap数组中对应的位置是否已经被置为1

    • 如果都是1,则该元素可能存在,否则肯定不存在。

    • 优点

      • 占用空间小,查询速度快,空间效率和查询时间都远远超过一般的算法
    • 缺点

      • 有一定的误识别率,有一定的误识别率,即某个元素可能存在,但实际上并不存在。
      • 删除困难,因为无法确定某个位置是由哪个元素映射而来的
  • 案例测试地址:https://www.jasondavies.com/bloomfilter/

在这里插入图片描述
在这里插入图片描述

  • 记住结论:不存在的一定不存在,存在的不一定存在

  • 注意点

    • 布隆过滤器存在误判率,数组越小,所占的空间越小,误判率越高;如果要降低误判率,则数组越长,但所占空间越大

    • 最大限度的避免误差, 选取的位数组应尽量大, hash函数的个数尽量多, 但空间占用的浪费和性能的下降

    • 业务选择的时候, 需要误判率与bit数组长度和hash函数数量的平衡

    • 布隆过滤器不能直接删除元素,因为所属的bit可能多个元素有使用

    • 如果要删除则需要重新生成布隆过滤器,或者把布隆过滤器改造成带引用计数的方式

  • 如何解决布隆过滤器不支持删除的问题

    • Counting Bloom Filter将标准 Bloom Filter位数组的每一位扩展为一个小的计数器(counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。Counting Bloom Filter通过多占用几倍的存储空间的代价,给Bloom Filter增加了删除操作。

在这里插入图片描述

2.BloomFilter业务中的应用场景

(1)海量数据下垃圾邮件解决方案(垃圾短信、黑名单同理)

  • 收集一组具有特定特征的垃圾邮件样本,这些样本可以是文本内容或其他特征,比如发件人、收件人等
  • 将这些样本的特征信息进行哈希处理,并将处理后的结果存储在布隆过滤器中。
  • 接下来,当有新的电子邮件到达时,将该邮件的特征信息也进行哈希处理,并且与布隆过滤器中的信息进行比较
  • 如果布隆过滤器中存在该邮件的特征信息,则判断该邮件为垃圾邮件;如果不存在,则判断该邮件为正常邮件

在这里插入图片描述

(2)解决缓存穿透解决方案

  • 什么是缓存穿透(查询不存在数据)
    • 查询一个不存在的数据,由于缓存是不命中的,如发起为id为“-1”不存在的数据
    • 如果从存储层查不到数据则不写入缓存,导致这个不存在的数据每次请求都要到存储层去查询,
    • 大量查询不存在的数据,可能DB就挂掉了,是黑客利用不存在的key频繁攻击应用的一种方式
  • 将所有要【缓存的数据】经过处理后存储布隆过滤器中,即对应的bit上是1
  • 当外部请求发起时,首先会把请求的参数 通过哈希算法处理,获得相应的哈希值;
  • 根据哈希值计算出位数组中的位置,如果全部计算的hash值对于的bit存储都是1
  • 则表示数据在合理中,从缓存读出(缓存失效则从数据库中取出)
  • 如果计算的hash值对于的bit存储存在一个是0或以上,则表示这条数据不合理,直接返回数据不存在,不查缓存和数据库
  • 如果布隆过滤器认为值不存在,那么值一定是不存在的,无需查询缓存也无需查询数据库

在这里插入图片描述

(3)爬虫URL去重和分库分表注册手机号唯一性解决方案

大量的网页爬取,通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页
同一个网页链接有可能被包含在多个页面中,会导致爬虫在爬取的过程中,重复爬取相同的网页
  • 创建布隆过滤器,根据业务数据量设置位数组的大小,将位数组全部设置为0;
  • 将每个URL地址通过哈希算法处理,获得相应的哈希值;
  • 根据哈希值计算出位数组中的位置,将位数组中的位置设置为1;
  • 当新的URL地址进入时,重复上述步骤计算出对应的位置
  • 检查位数组中的位置是否为0,如果是0,则表示该URL地址一定没被爬取过;
  • 如果URL地址不存在,经过爬虫处理后,则将其对应的位置设置为1,以表示该URL地址已经存在;
  • 重复上述步骤,直到所有的URL地址都处理完毕,完成去重。

在这里插入图片描述

(4)海量数据下-分库分表下手机号重复注册解决方案

  • 一般业务里面的partitionKey是不可变动的,所以不能用手机号作为分片键(换手机号需求是存在的)
  • 所以业务里面的分片键,多数是固定的业务id,比如user_id

在这里插入图片描述

  • 创建布隆过滤器,根据业务数据量设置位数组的大小,将位数组全部设置为0;

  • 把要注册的手机号通过通过哈希算法处理,获得相应的哈希值;

  • 根据哈希值计算出位数组中的位置,如果对应的位数组中的位置有存在0,则一定是未注册的

  • 如果经过多个hash函数处理,对应的位数组中都是1,则认为是注册过的

  • 最后如果用户注册成功后,将位数组中的位置设置为1

  • 根据哈希值计算出位数组中的位置,如果对应的位数组中的位置有存在0,则一定是未注册的

  • 如果经过多个hash函数处理,对应的位数组中都是1,则认为是注册过的

  • 最后如果用户注册成功后,将位数组中的位置设置为1

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-03-03 mysql列存储-cpu占用100%-追踪思路

摘要: 最近在处理mysql列存储时, 发现在执行explain时, cpu占用达到了100%. 本文分析定位该问题的思路过程 现象: mysqld进程占用100%使用kill processlist终止会话, 无响应查看show processings; 发现一直在运行mysql> show processlist; +----+-----------------+-----…

图片服务器

文章目录一、项目简介二、功能及场景三、业务设计四、数据库设计准备图片表准备实体类五、API设计常用功能封装文件上传文件上传获取图片列表接口获取图片内容删除图片接口六、项目优化七、测试自动化测试测试用例一、项目简介 图片服务器:解决项目中插入图片的问题…

Java 运算符与类型转化

Java 运算符与类型转化 1 算术运算符 Java中的算术运算符主要有(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符。 2 自增和自减运算…

Day906.grant语句 -MySQL实战

grant语句 Hi,我是阿昌,今天学习记录的是关于grant语句的内容。 在 MySQL 里面,grant 语句是用来给用户赋权的。 不知道有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使…

搞懂它,带你学会高效配置交换机!

想了解更多IT学习资料,可关注公众号“IT运维大本营” 不同网段的用户想要进行三层通信,必须借助于路由表项,而VLANIF接口只能生成直连路由,实现不同网段间通过同一台设备互通,对于不同网段间跨设备…

【Linux】虚拟机设置ISO镜像、配置CentOS 7、设置快照

目录 一、设置ISO镜像 1.设置或编辑 2.配置光驱(DVD) 3.虚拟机快捷键设置 4.启动虚拟机 二、配置CentOS 7 三、设置快照 四、​​​​​​​虚拟网卡不显示怎么办? 💟 创作不易,不妨点赞💚评论❤️收…

安装打印机驱动程序的操作步骤,详细方法介绍

安装打印机驱动程序是使用打印机的前提条件,因此学会正确的安装方法是非常重要的。下面是安装打印机驱动程序的详细步骤分析,为你全面的讲解安装和出现故障如何处理等问题。 一.安装打印机的准备工作 在安装打印机驱动程序之前,需要先准备好…

【Java集合框架】篇六:Collections工具类

Collections 是一个操作 Set、List 和 Map 等集合的工具类。 1。 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法)&…

软件测试6

一 css书写位置,引入方式 1.内嵌式:css写在style标签中,放在title标签的后面,因为html代码和css代码混在同一个文件中,所以叫内嵌式。 2.外链式:css代码和html代码分离,使用link标签设置href属…

UE 蓝图上帝视角

UE 蓝图上帝视角 UE5蓝图实现相机上帝视角控制,包括绕点旋转,水平平移,远近缩放 实现效果 绕点旋转 水平平移 实现功能 左键鼠标平移(相对于场景水平面平移)右键绕点旋转中间键视角前后移动(可以理解成…

linux网络管理、测试网络连通性

一、网络管理 在rhel7上,同时支持network.service和NetworkMananger.service(简称NM)。在rhel8上,已经废弃network.service,因此只能通过NM进行网络配置,包括静态ip和动态ip。在rhel8上,必须开启…

安卓短信自动填充踩坑

安卓短信自动填充踩坑 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出在机型的适配上。小米的短信权限、荣耀的短信监听都是坑,…

LabVIEW绘制带有两个不同标尺的波形图/图表

LabVIEW绘制带有两个不同标尺的波形图/图表拥有多组不同标尺的数据,想要在LabVIEW中显示这些数据。能否在同一张波形图/图表中使用多个不同的标尺绘制这些数据?通过在同一波形图上使用多个轴,可以使用不同的标尺绘制数据。请按照以下步骤操作…

【网络】-- 网络基础

(本文是网络的宏观的概念铺垫) 目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP 五层(或四层)模型 报头 以太网 碰撞 路由器 IP地址和MAC地址 IP地址与MAC地址总结 IP地址 MAC地址 计算机…

混合图像python旗舰版

仔细看这个图像。然后后退几米再看。你看到了什么?混合图像是指将一张图片的低频与另一张图片的高频相结合的图片。根据观看距离的不同,所得到的图像有两种解释。在上面的图片中,你可以看到阿尔伯特爱因斯坦,一旦你离开屏幕或缩小…

UG曲面造型-搭建轮廓和曲面创建(通过网格曲面,填充曲面,割面补面,曲面合格性分析)

先在xy平面创建一段圆弧,圆弧两端固定在坐标轴上在yz平面创建一段圆弧,圆弧两端固定在坐标轴上最后在xz平面创建圆弧,圆弧两端与之前的两个圆弧端点重合完成之后的草图如下:接下来构造曲面:方法1:采用通过曲…

HTML、CSS学习笔记5(移动端基础知识、Flex布局)

一、移动端基础知识 1.PC端和移动端区别 移动端:手机版网页,手机屏幕小,网页宽度多数为100%,没有版心 PC端:电脑版网页,屏幕大,网页固定版心 PC端和移动端不是同一个网页 2.如何在电脑里面…

pytorch-模型训练常用的torchvision包。关于数据、模型、数据增强、优化器、损失函数。用官方的实现,自定义模型训练

pytoch关于图像数据的部分 一般情况下处理图像、文本、音频和视频数据时,可以使用标准的Python包来加载数据到一个numpy数组中。 然后把这个数组转换成 torch.*Tensor。 图像可以使用 Pillow, OpenCV 音频可以使用 scipy, librosa 文本可以使用原始Python和Cython…

3D立体视觉成像原理介绍【一 】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言什么是基线?基线是如何影响3D图像质量激光三角测量飞行时间结构光相机时间编码结构光前言 本文将介绍3D立体视觉的成像原理,包括【激光三…

【JUC2022】第五章 ThreadLocal

【JUC2022】第五章 ThreadLocal 文章目录【JUC2022】第五章 ThreadLocal一、是什么二、案例三、使用规范四、源码分析五、内存泄漏问题六、实际应用 Demo一、是什么 ThreadLocal 提供线程局部变量,这些变量与正常的变量不同,因为每一个线程在访问 Threa…