布隆过滤器【美与不美之谈】

news2024/11/25 3:03:02

什么是布隆过滤器

布隆过滤器其实本质上来讲就是一种巧妙的数据结构,特点就是高效的插入和查询。

它能告诉我们:什么一定不存在,或者什么可能会存在

总结:布隆过滤器是概率性的。它只能告诉我们什么一定不存在,或者什么有可能存在

布隆过滤器能解决什么问题

一、解决缓存穿透的场景:

倘若查询大量不存在的数据,查询缓存 -> 查询DB,此时都缓存一直没数据,就会一直查DB,则为缓存穿透

使用布隆过滤器,能够拦截大量查询不存在数据的请求,以免大量的查询走到DB那一层

二、大集合查询某一个具体的数据的场景(比如一亿个用户系统中查询某个用户是否下过单)

总结:以上两种场景都有一个共性,判断一个元素是否在某一个集合中。使用布隆过滤器能够有效解决此场景的问题。

布隆过滤器的原理

一、哈希函数

哈希函数:将任意大小的数据经过转换,得到了特定大小的数据。譬如,原数据为userPhone,经hash函数转换后得到的数据即为hash code。

如图所示,phone1经过hash函数转换后得到了hash code = 00,而phone2、phone3经过hash函数转换后得到了hash code = 01。

由此可知,数据得到了压缩,且哈希函数是实现布隆过滤器的基础。

二、数据结构

布隆过滤器的数据结构其实就是一个bit数组,具体的结构如下所示:

如图所示,其结构每一个下标所对应的数值都对应的是0、1制的数据值。

三、执行原理

假设有2个元素 {x , y},且当前布隆过滤器设置了2个hash函数。此时x,y两个元素经过hash函数映射得到的数据结果如下图所示

  • 由图可知, {x , y}经过2个hash函数的映射,分别占用index = [ 2 , 10 ]、[ 3 , 11 ];此时我们的这些index下标,所对应的value值由0改为了1。
  • 查询 µ 是否在集合里,首先将 µ 分别经过2个hash函数映射,得到index = [ 11 , 18 ]的value值:index[11] = 1,index[18] = 0;由于index[18] = 0(存在一个下标所对应的value为0的数值,此元素必然不存在集合中,因此 µ 必然不在集合中)
  • 查询 ß 是否在集合中,其经过2个hash映射分别得到index = [ 2 , 10 ]的value值:index[2] = 1,index[10] = 1;(由于其所映射的index下标所对应的value都为1,因此 ß 有可能存在集合中 )

PS:此处的数据存在集合中,是非必然存在的,而是有可能存在,存在一定的误判几率

假设 ß 经过hash函数映射得到index = [ 2 , 10 ],虽然这2个下标所对应的value都是1,但是 [ 2 , 10 ] 有可能是由不同元素经过hash函数映射出来的下标值。

因此这种情况说明 ß 经过hash函数映射得到index = [ 2 , 10 ],其也并非绝对是一个元素经过hash函数映射过来的,故此存在误判的可能。

总结:布隆过滤器经过hash函数映射得到值都是1,则说明数据可能会存在;但是某一位数值是0,则说明数据一定不存在

布隆过滤器的业务实现方式

代码实现可以参考redisson的bloom filter,或者使用goove包的布隆过滤器(不详细展开,可参考网上代码)

业务接入流程:

布隆过滤器的美与不美

美之所在:

  1. 能够过滤大部分的无效请求,譬如查询一个不存在的数据,直接可通过布隆过滤器拦截无效请求。
  2. 针对高并发场景,在保护系统层面起到一定程度的作用
  3. 概念简单,性能较好

不美之所在:

  1. 存在误判率(误判率可以通过:增加数组长度、增加hash次数等方式来进行,但是代价是其会让布隆过滤器的性能降低,CPU需要运算更多的内容)
  2. 无法删除布隆过滤器中的数组数据(倘若布隆过滤器需要重新刷新数据,建议使用定时器定时创建一个新的布隆过滤器,废弃旧的布隆过滤器)
  3. hash函数个数和布隆过滤器的数组长度不好定义
    1. 倘若布隆过滤器数组长度过小,那么数组的所有bit位都会变成1,就起不到过滤的作用了
    2. hash函数的个数也不宜过多,倘若hash函数太多,则数组所有bit位都变为1的速度也会过快
    3. 倘若hash函数太少,误报率也会变高,譬如所有数据都只经过1次hash,那么hash碰撞的概率极大,所得到的bit位重复概率也会随之增多
  4. 首次初始化布隆过滤器存在一定的代价,倘若数据量过大,初始化工作量和复杂度也会增加

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

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

相关文章

科技向“实”万物生长,2023年云计算五大技术趋势展望

科技云报道原创。 近日,全球最大的专业技术组织IEEE(电气电子工程师学会)发布了《IEEE全球调研:科技在2023年及未来的影响》。根据相关调研显示,云计算(40%)、5G(38%)、元宇宙(37%)将成为影响2023年最重要的技术,其中云计算位居首…

算法---模拟(2)

目录 一、模拟算法题目 (1)神奇的幻方 (2)Proceting the Flower (3)排座椅 (4)国王的游戏 (5)字典序最大的子序列 一、模拟算法题目 (1&…

Spring源码下载

一、Spring | Home 二、Projects->Spring Framework 三、点击小猫图片进入Spring Framework的代码仓 四、选择感兴趣的分支

如何实现高性能点赞(二)

1.3 Redis 的数据结构类型 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset&…

Mac M2芯 超详细k8s集群实战 - kubeadm

概述 我们准备搭建kubeadm的masterworker集群,实现k8s集群,master、worker在虚拟机上来执行,中间遇到了超级多的坑,都搞定了之后,在这里系统的总结一下,这也是一篇学习笔记。 这篇比较难搞,如…

【网络安全】Fastjson的反序列化漏洞复现

1.漏洞概述 Fastjson提供了autotype功能,允许用户在反序列化数据中通过“type”指定反序列化的类型,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时&…

qt简单UI使用

geometry设置窗口大小 font字体大小 text改文件名

本地使用隧道或代理访问云服务器数据库

本地使用代理访问云服务器数据库 场景: 项目的测试环境是部署至云服务器上的,有时候云服务器的项目测试出现了一些问题,为了方便复现就在本地直连云服务器的数据库(mysql服务器)。但是云服务器是有三台机子&#xff0…

性能测试工程师技术履历表

技术履历表 基本情况 姓名 XXX 年龄 26 性别 男 工作年限 3-4 岗位 性能测试工程师 毕业院校和专业 武汉软件工程职业学院 学历 大专 技能评价 1、熟悉基于Http,TCP等协议的脚本开发。 2、 熟练掌握:Loadrunner等压测工具。 3、 掌握Linu…

Echosync 一款优秀的文件夹同步和备份软件

Echosync 一款优秀的文件夹同步和备份软件 通过执行差异数据备份、文件同步,这样可以避免传递自上次备份以来所做的更改,Echosync能够检测到移动或重命名自上次备份的文件。 下载 Echosync 软件介绍 VHD中备份文件 你的文件可以保存到单个 VHD 文件…

RK3568 ov5695摄像头

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、什么是mipi接口?二、摄像头是如何把数据给到RK3568,又是如何处理硬件连接关系图:图像数据的来龙去脉代码路径三、如何移植修改设备树…

高通开发系列 - 数字和模拟codec驱动

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 MSM89XX音频硬件框架Linux kernel驱动LPASS的地址空间PM和PMI的区别PM8953简介Slave ID从设备idPM89xx中的模拟codec驱动准备codec的驱…

进程退出与等待

1️⃣ 进程退出 正常终止 main函数的返回调用exit_exit 异常终止 Ctrl c (信号终止) 1.main函数的返回就是return 0;程序退出这个在高级语言里面就学过了不多说。 2.exit(x)的使用如下 第一次测试:错误码与main函数里面打印的值。 第二次测试&#xf…

[oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg

查看进程 回忆上次内容 上次先进程查询 ps -elf 查看所有进程信息ps -lf 查看本终端相关进程信息 杀死进程 kill -9 PID 给进程发送死亡信号 运行多个 python3 show_time.py 的话 各个进程独立python3 show_time.py 大概 8M各占内存这些进程之间是什么关系呢?&…

秦海璐、宋轶现身,岳云鹏孙越成谜,央视春晚第一次彩排姗姗来迟

最近一段时间,全国各地的朋友都在积极行动,都想推迟成为小阳人的时间,却险些忘了一件大事。伴随着春节的临近,每年的央视春晚都倍受期待,今年当然也不例外,可是却一直没有央视春晚的消息。 就在大家都认为&…

利用adb查找手机定位,并且打开地图定位

可以使用 Android Debug Bridge (ADB) 工具来查找手机的位置信息。 首先,您需要确保手机已连接到电脑(内网穿透或者搭建虚拟局域网),并且已在手机上启用 USB 调试。然后,您可以在电脑的命令提示符下使用 ADB 命令来查询…

小程序框架

目录 一,框架 二,响应的数据绑定 三,页面管理 四,基础组件 逻辑层 App Service 五,小程序的生命周期 六,注册页面 1.使用 Page 构造器注册页面 2.在页面中使用 behaviors 3.使用 Component 构造器…

[HAL库]STM32 ADC功能和DMA读数据的方法

这篇博客记录下 STM32F103R8T6 是怎么开ADC、用DMA搬数据的方法。方便日后使用的时候查资料。 DMA其实就是个搬运工,专门负责搬数据,没有DMA之前,搬数据是由MCU核心来负责,虽说都能完成搬数据的动作,但是MCU干这件事浪…

1.从一次提交中思考代码性能优化和stream的使用

前言 其实由来很简单,我们用了一个第三方的开源平台,这个平台基于 ruoyi 3.8.1 开发,我想后续同步到ruoyi的最新版 今天看的是 一个字典查询的commit,我们下来看下这次提交是如何优化的 分析 开门见山,我们看下代码…

PowerTCP FTP for .NET对.NET 7的支持

PowerTCP FTP for.NET是一个高级FTP和FTPS类库,具有易于使用的接口。它具有泛型、IPv6、双堆栈套接字、并发会话mX509证书,并包括完整的SSL和TLS集成。 用于.NET功能的PowerTCP FTP 流接口支持在没有文件访问的情况下创建或检查内存中的数据。 可序列…