06_布隆过滤器BloomFilter

news2024/11/16 3:27:51

06——布隆过滤器BloomFilter

一、是什么

由一个初始值都为零的bit数组多个哈希函数构成,用来快速判断集合中是否存在某个元素

image-20230313220219220

设计思想:

1. 目的:减少内存占用
1. 方式:不保存数据信息,只是在内存中做一个是否存在的标记flag
1. 本质:判断具体数据是否在一个大的集合中

备注:布隆过滤器时一种类似set的数据结构,只是统计结果在巨量数据下有 小瑕疵,不够完美

image-20230313221000238

二、能干嘛

  1. 高效地插入和查询,占用空间少,返回的结果是不确定性+不够完美(哈希冲突)。
  2. 重点:一个元素如果判断结果:存在时,元素不一定存在,但是判断结果不存在时,则一定不存在。
  3. 布隆过滤器可以添加元素,但是不能删除元素,由于涉及hascode判断依据,删除元素会导致误判率增加。
  4. 总结:
    1. 有:可能有
    2. 无:一定无

三、原理

  1. 布隆过滤器实现原理和数据结构

    image-20230313221926014

    添加key与查询key

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1B6gZyW-1692427541189)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303132220955.png)]

    hash冲突导致数据不准确

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8uqJygE-1692427541190)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303132223964.png)]

    查询某个变量的时候,只需要看看这些点是不是都是1,就可以大概率知道集合中是否存在了。

    如果这些点,有任何一个为零,则查询的key一定不存在。

    如果全部是1,则被查询的key很大概率存在。(因为使用的hash散列函数,会有碰撞冲突)

    正是基于布隆过滤器的快速检测特性,我们可以在把数据写入数据库时,使用布隆过滤器做个标记。当缓存缺失后,应用查询数据库时,可以通过查询布隆过滤器快速判断数据是否存在。如果不存在,就不用再去数据库中查询了。这样一来,即使发生缓存穿透了,大量请求只会查询Rdis和布隆过滤器,而不会积压到数据库,也就不会影响数据库的正常运行。布隆过滤器可以使用Rdis实现,本身就能承担较大的并发访问压边。

    hash函数冲突

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TehVDTf3-1692427541190)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303132228541.png)]

    image-20230313222909547

  2. 使用步骤

    1. 初始化bitmap

    2. 添加元素占坑位

      image-20230313223405750

    3. 判断元素是否存在

      image-20230313223542751

  3. 布隆过滤器误判率,为什么不要删除

    布隆过滤器的误判是指多个输入经过哈希之后在相同的t位置1了,这样就无法判断究竞是哪个输入产生的,因此误判的根源在于相同的bt位被多次映射且置1。

    这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个bt并不是独占的,很有可能多个元素共享了某一位。

    如果我们直接删除这一位的话,会影响其他的元素

    特性:布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

  4. 总结

    1. 有:很可能有
    2. 无:一定无

    使用时最好不要让实际元素数量远大于初始化数量,一次给够,避免扩容

    当实际元素数量超过初始化数量时,应该对布隆过滤器进行重建,重新分配一个size更大的过滤器,再将所有的历史元素批量add。

四、使用场景

  1. 解决缓存穿透的问题,和redis结合bitmap使用

    image-20230313224636964

    image-20230313224736356

  2. 黑名单校验,识别垃圾邮件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDWuLolY-1692427541194)(/Users/coder/Library/Application Support/typora-user-images/image-20230313224905294.png)]

  3. 安全连接网址,全球数10亿的网址判断

五、尝试手写布隆过滤器

  1. 整体架构

    image-20230313225140967

  2. 步骤设计

    redis的shebit、getbit

    setbit的构建过程

    gitbit查询是否存在

  3. 编码实现

  4. 案例

六、布隆过滤器优缺点

七、布谷鸟过滤器

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

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

相关文章

【框架类】—MVVM框架

一、MVVM框架有哪些 Vue.jsReact.jsAngular.js 二、对MVVM的认识 1. MVC是什么 全称 Model View Controller, 它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离 2. MVVM的定义 MVVM是一种软件架构模式,它代表了模型 --视…

智慧工地监管一体化云平台源码 PC端、 手机端、 现场端

智慧工地管理平台是以物联网、移动互联网技术为基础,充分应用大数据、人工智能、移动通讯、云计算等信息技术,利用前端信息采通过人机交互、感知、决策、执行和反馈等,实现对工程项目內人员、车辆、安全、设备、材料等的智能化管理&#xff0…

Python 潮流周刊#16:优雅重要么?如何写出 Pythonic 的代码?

你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。标题取自其中两则分享,不代表全部内容都是该主题,特此声明。 本周刊由 Python猫 出品,精心筛选国内外的 250 信息源,为你挑选…

Linux(入门篇)

Linux(入门篇) Linux概述Linux是什么Linux的诞生Linux和Unix的渊源GNU/LinuxLinux的发行版Linux VS Windows Linux概述 Linux是什么 Linux是一个操作系统(OS) Linux的诞生 作者:李纳斯托瓦兹(git也是他开发的😂&am…

11. 实现业务功能--获取用户信息

目录 1. 实现 Controller 2. 单体测试 3. 修复返回值存在的缺陷 3.1 用户的隐私数据:密码的密文和盐不能显示 3.2 将值为 null 的字段可以进行过滤 3.3 时间的格式需要进行处理,如 yyyy-mmmm-ddd HH:mm:ss 3.4 data 属性没有返回 4. 实现前端页…

低代码平台全套源码,支持二次开发

低代码开发平台:只需要编写简单的配置文件即可构建企业级应用程序。 一、低代码PaaS平台可以在云端开发、部署、运行低代码应用程序。使用独立数据库模型,基于Kubernetes云原生技术,每个租户均可拥有一套独立的存储、数据库、代码和命名空间&…

光栅化之扫描填充三角形

重心坐标计算 重心坐标比较简单,取最大包围合再计算点是否在三角形内就行,再根据重心坐标返回的alpha,beta,gamma三个权重值计算 uv映射和depth深度缓冲值,因为是求的重心坐标,感觉效果比插值的要好一点。 求重心坐标 barycentr…

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

bit7z一个c静态库,为7-zip共享库提供了一个干净简单的接口 使用CMAKE重新编译github上的bit7z库,用来解压/预览iso9660,WIm,Zip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式 导读 编译bit7z(C版本)使用mscv 2017编译…

C# 把dll打包到exe文件,真的可以 。文件批量转了ANSI编码

在 C# 中,将 DLL 文件打包到 EXE 文件中可以使用 ILRepack 工具。ILRepack 是一个开源的工具,可以合并多个 DLL 文件并将它们嵌入到一个 EXE 文件中,从而实现将 DLL 打包到 EXE 的功能。 以下是使用 ILRepack 工具打包 DLL 到 EXE 的步骤&…

CSDN今日热榜词云图

文章目录 C云原生人工智能和Python前沿技术软件工程后端javajavascriptphp区块链大数据移动开发嵌入式开发工具数据结构与算法微软技术测试游戏网络运维 C C果然还是应试语言,真题的占比竟然这么大。C之所以没出现,很有可能是在做词云的时候把加号当作非…

多人联机对战游戏赛道,你准备好了吗?

用户日益增长的精神需求和社交娱乐需要,让联机对战的需求与日剧增。 硬件和网络技术的高速发展,也使得联机游戏的体验越来越好。 可以看到,越来越多的联机对战游戏登上游戏榜单。 联机对战已逐渐成为主流,无论在哪个游戏榜单&…

二,MySQL数据库主从复制的介绍及搭建(收藏)

一,介绍概述 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 DDL:数据定义语言,用…

HRS--人力资源系统(Springboot+vue)--打基础升级--(二)写个主菜单导航界面

1. 华为OD机考题 答案 2023华为OD统一考试(AB卷)题库清单-带答案(持续更新) 2023年华为OD真题机考题库大全-带答案(持续更新) 2. 面试题 一手真实java面试题:2023年各大公司java面试真题汇总--…

计算机 数进制转换;存储MB与带宽Mbps

参考:https://zhuanlan.zhihu.com/p/459817484 1、计算机 数进制转换 1)与十进制相关的转换 2)与二进制相关的转换 二进制是Binary,简写为B;八进制是Octal,简写为O;十进制是Decimal&#xff…

117页数字化转型与产业互联网发展趋势及机会分析报告PPT

导读:原文《》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发本文,了解更多内容请私信:方…

Ubuntu16.04-ros-kinetic环境搭建笔记=1=

tips:搬运资料,留个记录 安装Ubuntu Ubuntu官网下载地址 安装 虚拟机安装Ubuntu 最好断网安装Ubuntu,可以节约时间 Ubuntu基础设置 Ubuntu换国内源 换成清华源 sudo apt upgradeVMwareTool安装 把这个压缩包拖到桌面,否则只读…

PyTorch翻译官网教程-TEXT CLASSIFICATION WITH THE TORCHTEXT LIBRARY

官网链接 Text classification with the torchtext library — PyTorch Tutorials 2.0.1cu117 documentation 使用torchtext库进行文本分类 在本教程中,我们将展示如何使用torchtext库来构建用于文本分类分析的数据集。 使用迭代器访问原始数据构建数据处理管道…

JAVA基础知识(四)——面向对象(上)

面向对象(上) 一、面向对象的概念1.1 何谓“面向对象”的编程思想1.2 面向过程(POP)与面向对象(OOP)1.3 面向对象的思想概述 二、类和对象2.1 面向对象的思想概述 三、对象的创建和使用3.1 设计类以及类和对象的使用3.2 类和对象 四、类的成员之一&#…

leetcode 125.验证回文串

⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/valid-palindrome/ 思路: 这道题只判断字符串中的字母与数字是否是回文。虽然小写大写字母可以互相转换,但是里面是含有数字字符的,所以先统一&#xff…

solr快速上手:聚合分组查询|嵌套分组指南(十二)

0. 引言 solr作为搜索引擎经常用于各类查询场景,我们之前讲解了solr的查询语法,而除了普通的查询语法,有时我们还需要实现聚合查询来统计一些指标,所以今天我们接着来查看solr的聚合查询语法 1. 常用聚合查询语法 以下演示我们…