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

redis布隆过滤器原理及应用场景

目录

        原理

        应用场景

        优点

        缺点

布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用位数组和哈希函数来判断一个元素是否存在于集合中。

原理

  1. 数据结构
    • 位数组:一个由0和1组成的数组,初始值全部为0。
    • 哈希函数:使用多个哈希函数对元素进行哈希处理,生成多个哈希值。
  2. 添加元素
    • 当一个元素需要被添加到布隆过滤器中时,通过多个哈希函数生成多个哈希值。
    • 将这些哈希值对应的位数组位置设置为1。
  3. 查询元素
    • 当需要查询一个元素是否存在于布隆过滤器中时,同样通过多个哈希函数生成多个哈希值。
    • 查询这些哈希值对应的位数组位置是否都为1。
      • 如果任何一个位数组位置不为1,则该元素肯定不存在于布隆过滤器中。
      • 如果所有位数组位置都为1,则该元素可能存在于布隆过滤器中(存在误判的可能)。
  4. 误判与漏判
    • 由于多个元素可能会被哈希到同一个位数组位置上,因此布隆过滤器可能会出现误判,即将不在集合中的元素判断为在集合中。
    • 但是,布隆过滤器不会漏判,即不会把在集合中的元素判断为不在集合中。
  5. 参数调整
    • 误判率可以通过调整哈希函数的数量和位数组的大小来控制。
    • 一般来说,哈希函数数量越多、位数组越大,误判率越低,但空间占用也会增加。

应用场景

  1. 缓存穿透防护
    • 在使用缓存时,如果缓存中没有某个数据,系统通常会去数据库中查询。但如果大量请求查询的数据都不存在于缓存中,就会对数据库造成巨大压力,这种现象称为缓存穿透。
    • 使用布隆过滤器可以预先判断某个数据是否存在于缓存中(注意这里存在误判,但可以接受),从而避免不必要的数据库查询。
  2. 网页爬虫的去重
    • 在网络爬虫中,为了避免重复爬取相同的网页,可以使用布隆过滤器来存储已经爬取过的网页URL。
    • 每当爬虫遇到一个新的URL时,先通过布隆过滤器判断该URL是否已经被爬取过,如果没有,则进行爬取并将其加入到布隆过滤器中。
  3. 数据库查询优化
    • 在数据库查询时,尤其是在处理大量数据的场景中,可以使用布隆过滤器来快速判断某个查询条件是否可能匹配到数据。
    • 如果布隆过滤器判断某个查询条件不可能匹配到数据,则可以直接返回空结果,避免进行耗时的数据库查询。
  4. 敏感词过滤
    • 在内容审核系统中,为了过滤掉敏感词,可以使用布隆过滤器来存储敏感词列表。
    • 当用户提交内容时,通过布隆过滤器快速判断内容中是否包含敏感词,如果包含则进行相应的处理。
  5. 垃圾邮件识别
    • 在邮件系统中,为了识别垃圾邮件发送者的邮箱地址,可以使用布隆过滤器来存储已知的垃圾邮件发送者邮箱地址。
    • 当收到新邮件时,通过布隆过滤器判断发件人邮箱地址是否存在于垃圾邮件发送者列表中,如果存在,则可以初步判断该邮件为垃圾邮件。
  6. 分布式系统中的元素存在性判断
    • 在分布式系统中,多个节点之间需要共享数据并判断某个元素是否存在。
    • 使用布隆过滤器可以在不共享完整数据集的情况下,高效地判断元素是否存在,从而减少网络通信和存储成本。
  7. 大规模数据去重
    • 在处理大规模数据集时,为了去除重复数据,可以使用布隆过滤器进行初步去重。
    • 需要注意的是,由于布隆过滤器的误判特性,去重后可能还需要进行进一步的处理(如使用其他数据结构进行精确去重)。
  8. API 频率限制
    • 在提供API服务时,为了防止某个用户或IP地址过度请求资源,可以使用布隆过滤器来记录用户或IP地址的请求频率。
    • 当用户或IP地址发起请求时,通过布隆过滤器判断其请求频率是否超过了限制,如果超过则拒绝服务

优点

  1. 空间效率高
    • 布隆过滤器通过位数组和多个哈希函数实现,相比其他数据结构(如散列表),其空间占用更低。位数组的每个元素只占用1bit空间,极大地节省了存储空间。
  2. 查询效率高
    • 布隆过滤器的查询操作非常快速,因为它只需要对位数组进行简单的位运算,而不需要进行磁盘I/O或复杂的数据结构遍历。查询时间复杂度通常为O(k),其中k为哈希函数的个数,一般较小。
  3. 可扩展性强
    • 布隆过滤器可以根据需要动态调整位数组的大小和哈希函数的数量,以适应不同规模的数据集。
  4. 适用于保密场景
    • 布隆过滤器不存储数据本身,只存储数据的哈希值,因此在某些对保密要求较高的场景中(如密码存储、敏感信息过滤等)具有优势。
  5. 支持交、并、差运算
    • 使用同一组哈希函数的布隆过滤器之间可以进行交、并、差运算,这在处理多个数据集时非常有用。

缺点

  1. 存在误判率
    • 布隆过滤器最大的缺点是无法准确判断元素是否一定存在,只能判断元素可能不存在或可能存在。由于哈希碰撞的存在,即使元素不在集合中,也可能因为其他元素的哈希值与之相同而被误判为存在。误判率随着元素的增加而增加,但可以通过增加位数组的大小和哈希函数的数量来降低。
  2. 无法删除元素
    • 布隆过滤器不支持直接删除元素。因为删除一个元素需要将其对应的位数组中的位重置为0,但这可能会影响到其他元素的存在性判断。虽然有些变种布隆过滤器(如Counting Bloom Filter)支持删除操作,但会牺牲一些空间效率和查询效率。
  3. 不存储元素本身
    • 布隆过滤器只存储元素的哈希值,不存储元素本身。因此,在需要获取元素具体信息时,布隆过滤器无法满足需求。
  4. 对哈希函数敏感
    • 布隆过滤器的性能受到哈希函数的影响。如果哈希函数设计不当或发生碰撞过多,将会导致误判率上升。

如何降低布隆过滤器的误判率:请参考我的另一篇文章

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis Stream:实时数据流的处理与存储
  • 论文创新的几种思路
  • lodash中flush的使用(debounce、throttle)
  • WGAN(Wassertein GAN)
  • Mysql面试合集
  • 机器学习---线性回归
  • 香橙派5plus上跑云手机方案一 redroid(带硬件加速)
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • STM32和DHT11使用显示温湿度度(代码理解)+单总线协议
  • Butterfly主题一图流背景及文章顶部图修改
  • 空间数据采集与管理:为什么选择ArcGISPro和Python?
  • CTF常用sql注入(三)无列名注入
  • 【postgresql】索引
  • QT面试笔记总计
  • 016-GeoGebra基础篇-加载项错误_使用此功能所需的服务已关闭,请检查你的隐私设置,
  • 2017前端实习生面试总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • If…else
  • Java编程基础24——递归练习
  • JDK 6和JDK 7中的substring()方法
  • Objective-C 中关联引用的概念
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Terraform入门 - 1. 安装Terraform
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 编写符合Python风格的对象
  • 计算机常识 - 收藏集 - 掘金
  • 数据仓库的几种建模方法
  • 译米田引理
  • 应用生命周期终极 DevOps 工具包
  • 用element的upload组件实现多图片上传和压缩
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (27)4.8 习题课
  • (70min)字节暑假实习二面(已挂)
  • (pytorch进阶之路)扩散概率模型
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (待修改)PyG安装步骤
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bashrc在哪里,alias妙用
  • .FileZilla的使用和主动模式被动模式介绍
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET 回调、接口回调、 委托
  • .NET业务框架的构建
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • ??javascript里的变量问题
  • [ C++ ] STL---string类的使用指南