布隆过滤器及其用法

1 定义

  布隆过滤器(Bloom Filter, BF)是由Howrad Bloom在1970年提出的一种具有高效时间和空间效率的二进制向量数据结构,用来检测一个元素是不是属于这个集合。注意,布隆过滤器只判断是否出现在集合中,无法给出元素在集合中的具体位置。

1.1 构造布隆过滤器

  关于如何构造布隆过滤器,下面以集合 S = { S 1 , S 2 , S 3 } S=\{S_{1},S_{2},S_{3}\} S={S1,S2,S3}为例进行说明。首先要说明一点,虽然布隆过滤器也需要利用哈希查询算法,但与传统的哈希查询算法不同,布隆过滤器并不存储集合中的具体元素,而是通过多次哈希函数将集合中的元素映射到二进制位串中。一旦集合元素被映射到对应的二进制位,则将对应位置改为1。
在这里插入图片描述
  上述布隆过滤器中,每个位置占1个比特位。如果每个位置改为多个比特位,这样就能表达出的信息。比如如下图所示的计数布隆过滤器。
在这里插入图片描述
注意:一般不对布隆过滤器执行删除元素的操作。

1.2 布隆过滤器查询过程

  在查询过程中,需要计算出相关元素 S i S_{i} Si对应的多个哈希地址,然后检查布隆过滤器中对应的位置上是否全部为1,若全都为1,则 S i S_{i} Si可能在布隆过滤器上(被称为假阳性问题);若不全为1,那么元素 S i S_{i} Si一定不在布隆过滤器上。

1.3 优点

  布隆过滤器的优点主要有以下几点:

  • 时间复杂低。无论是插入还是查询操作,布隆过滤器的时间复杂度均为 O ( k ) O(k) O(k),其中, k k k为哈希函数的数量。
  • 保密性好。布隆过滤器中并不保存元素的具体数值。
  • 占用空间小。

  而布隆过滤器的缺点主要为:存在误判率。当两个不同的值却能产生相同的哈希值时,布隆过滤器无法确定查询元素是否真的存在集合中。为了尽量降低误判率,布隆过滤器中一般都设置多个哈希函数。

2 python中使用布隆过滤器

2.1 安装包

  python中实现布隆过滤器的第三方包很多,这里使用的是pybloom-live (pybloomfiltermmap等包在Windows上安装遇到报错,无法解决)。

pip install pybloom_live
2.2 简单使用案例
from pybloom_live import BloomFilterbf=BloomFilter(capacity=100000,error_rate=0.001)
#构建布隆过滤器
for i in range(100000):bf.add(i)#查询元素
for i in [1,200,345,100323,3233232,'hello']:print(i in bf)

其结果如下:

True
True
True
False
False
False

补充

  • 什么是缓存穿透?
    缓存穿透是指在高并发场景下,缓存中(包括本地缓存和Redis缓存)的某一个Key被高并发的访问没有命中,此时会回数据库中访问数据,导致数据库并发的执行大量查询操作,对其造成巨大的压力。
    使用布隆过滤器可以解决缓存穿透的问题。比如在redis数据库中,先将所有的key都存到布隆过滤器中,当请求进来时,先去过滤器中校验key是否存在,如果不存在直接返回null。

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

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

相关文章

HubSpot成功全靠它?集客营销大揭秘

在当今数字化的商业世界中,吸引、转化和维护客户已经变得更具挑战性和复杂性。然而,有一家公司已经成功地帮助数千家企业实现了集客营销的成功。这家公司就是HubSpot。那么,HubSpot的成功到底全靠了什么?让我们揭开集客营销的大秘…

openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制

文章目录 openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制92.1 不支持的特性92.2 MOT限制92.3 不支持的DDL操作92.4 不支持的数据类型92.5 不支持的索引DDL和索引92.6 不支持的DML92.7 不支持的JIT功能(…

3D孪生场景搭建:3D漫游

上一篇 文章介绍了如何使用 NSDT 编辑器 制作模拟仿真应用场景,今天这篇文章将介绍如何使用NSDT 编辑器 设置3D漫游。 1、什么是3D漫游 3D漫游是指基于3D技术,将用户带入一个虚拟的三维环境中,通过交互式的手段,让用户可以自由地…

前端作业(17)

之后的20个作业&#xff0c;学自【20个JavaScript经典案例-哔哩哔哩】 https://b23.tv/kVj1P5f 支付倒计时 1. 支付10s倒计时 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compat…

跨境必备!WhatsApp营销——注册、养号、防封号!

前面的文章&#xff0c;我们给大家介绍了WhatsApp营销的定义以及重要性&#xff0c;相信许多跨境小伙伴已经摩拳擦掌&#xff0c;迫不及待讲WhatsApp纳入您的全渠道营销策略。当然&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;拥有安全的WhatsApp号与登录环境会让…

【网络安全 --- kali2022安装】kali2022 超详细的安装教程(提供镜像)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

【gcc】RtpTransportControllerSend学习笔记 3:gcc

本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。本文使用的代码是m79 ,与大神有不同。2.4 Probe只会在一些特殊的时候才会进行探测(链路刚开始时, 码率不正常暴跌时)2.5 : 对发送的吞吐量…

Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸

一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道&#xff0c;ui &#xff08;图片&#xff09;资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片&#xff0c;也是最占资源量的资源类型&#xff0c;游戏中的ui 资源还是人机交互的最重要的部分&#xff…

解决 Jenkins 性能缓慢的问题~转

解决 Jenkins 性能缓慢的问题 Docker中文社区 ​​ 计算机技术与软件专业技术资格持证人 2 人赞同了该文章 没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间&#xff0c;但您最终必须投资…

UG\NX CAM二次开发 获取当前加工导航器选中的对象数量和tag UF_UI_ONT_ask_selected_nodes

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 获取当前加工导航器选中的对象数量和tag UF_UI_ONT_ask_selected_nodes 效果: 代码: void MyClass::do_it() {//获取当前加工导航器选中的对象数量和TAGint count = 0;tag_t* objects = NULL…

stm32 - 中断

stm32 - 中断 概念中断向量表NVIC 嵌套中断向量控制器优先级 中断EXTI概念基本结构例子- 对射式红外传感器计次例子 - 旋转编码器 概念 stm32 支持的中断资源&#xff08;都属于外设&#xff09; EXTITIMADCUSARtSPII2C stm32支持的中断 内核中断 外设中断 中断通道与优先级 一…

物联网AI MicroPython传感器学习 之 噪音测量传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 麦克风噪音测量传感器&#xff0c;通过单片机对信号的简单处理&#xff0c;可实环境音检测、声控开关这样的有趣实验。传感器模块仅占用一个IO口&#xff0c;通过电压强度&#xff08;mV&#…

IIS部署Flask

启用 CGI 安装wfastcgi pip install wfastcgi 启用 wfastcgi 首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi&#xff0c;这个命令位于c:\python_dir\scripts&#xff0c;也就是你需要确保此目录在系统的PATH里&#xff0c;或者你需要cd到这个目录后再执行。 #…

MVC架构和DDD架构的区别?

前言 最近在学习一个开源社区项目&#xff0c;第一次听说了DDD项目架构&#xff0c;于是通过搜索之后来分享给大家 正文 当涉及到软件架构时&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;和DDD&#xff08;Domain-Driven Design&#xff09;是两种常见的设…

cpp primer plus笔记07-内存模型和命名空间

对于相同变量名的变量&#xff0c;CPP会覆盖作用域大的变量&#xff0c;而使用作用域小的变量&#xff0c;如果想在函数体内使用全局的变量可以在变量名前加上::加以区分&#xff0c;比如warm3会使得局部的warm变量等于3&#xff0c;而::warm3会使得全局的warm3 。 存储描述持…

rpm安装mysql8后碰到的问题

1 mysqld 无法启动 原因 已经使用了3306端口&#xff0c;修改my.cnf中端口为3308 2 修改为3308端口后&#xff0c;还是无法启动&#xff0c; 2023-10-07T02:20:10.096689Z 0 [ERROR] [MY-010262] [Server] Cant start server: Bind on TCP/IP port: Permission denied 2023…

Node-RED系列教程-25node-red获取天气

安装节点:node-red-contrib-weather 节点图标如下: 使用说明:node-red-contrib-weather (node) - Node-RED 流程图中填写经度和纬度即可。 演示: json内容: {

Linux服务器报错“No space left on device”如何解决

一、错误的含义&#xff0c;说明在服务器设备上的存储空间已经满了&#xff0c;不能再上传或者新建文件夹或者文件等。 二、确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间&#xff0c;复制下面命令在服务器上运行&#xff0c;然后发现如果如下图所示那么表明sda…

ViewConfiguration

包含 UI 中用于超时、大小和距离的标准常量的方法。 官址链接&#xff1a;https://developer.android.google.cn/reference/kotlin/android/view/ViewConfiguration?hlen 比如获取屏幕边缘的距离&#xff1a; val config ViewConfiguration.get(context) val edgeSlop con…

Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表

目录 一、问题描述二、问题解决1.场景一&#xff1a;同一事务中&#xff0c;新增并更新1.1 解决方案&#xff1a; 2.场景二&#xff1a;不同事务中&#xff0c;新增后更新场景2.1 解决方案&#xff1a; 一、问题描述 我们在使用 ShardingJDBC 作为分片工具的时候&#xff0c;会…