redis布隆过滤器原理及应用场景
目录
原理
应用场景
优点
缺点
布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用位数组和哈希函数来判断一个元素是否存在于集合中。
原理
- 数据结构:
- 位数组:一个由0和1组成的数组,初始值全部为0。
- 哈希函数:使用多个哈希函数对元素进行哈希处理,生成多个哈希值。
- 添加元素:
- 当一个元素需要被添加到布隆过滤器中时,通过多个哈希函数生成多个哈希值。
- 将这些哈希值对应的位数组位置设置为1。
- 查询元素:
- 当需要查询一个元素是否存在于布隆过滤器中时,同样通过多个哈希函数生成多个哈希值。
- 查询这些哈希值对应的位数组位置是否都为1。
- 如果任何一个位数组位置不为1,则该元素肯定不存在于布隆过滤器中。
- 如果所有位数组位置都为1,则该元素可能存在于布隆过滤器中(存在误判的可能)。
- 误判与漏判:
- 由于多个元素可能会被哈希到同一个位数组位置上,因此布隆过滤器可能会出现误判,即将不在集合中的元素判断为在集合中。
- 但是,布隆过滤器不会漏判,即不会把在集合中的元素判断为不在集合中。
- 参数调整:
- 误判率可以通过调整哈希函数的数量和位数组的大小来控制。
- 一般来说,哈希函数数量越多、位数组越大,误判率越低,但空间占用也会增加。
应用场景
- 缓存穿透防护:
- 在使用缓存时,如果缓存中没有某个数据,系统通常会去数据库中查询。但如果大量请求查询的数据都不存在于缓存中,就会对数据库造成巨大压力,这种现象称为缓存穿透。
- 使用布隆过滤器可以预先判断某个数据是否存在于缓存中(注意这里存在误判,但可以接受),从而避免不必要的数据库查询。
- 网页爬虫的去重:
- 在网络爬虫中,为了避免重复爬取相同的网页,可以使用布隆过滤器来存储已经爬取过的网页URL。
- 每当爬虫遇到一个新的URL时,先通过布隆过滤器判断该URL是否已经被爬取过,如果没有,则进行爬取并将其加入到布隆过滤器中。
- 数据库查询优化:
- 在数据库查询时,尤其是在处理大量数据的场景中,可以使用布隆过滤器来快速判断某个查询条件是否可能匹配到数据。
- 如果布隆过滤器判断某个查询条件不可能匹配到数据,则可以直接返回空结果,避免进行耗时的数据库查询。
- 敏感词过滤:
- 在内容审核系统中,为了过滤掉敏感词,可以使用布隆过滤器来存储敏感词列表。
- 当用户提交内容时,通过布隆过滤器快速判断内容中是否包含敏感词,如果包含则进行相应的处理。
- 垃圾邮件识别:
- 在邮件系统中,为了识别垃圾邮件发送者的邮箱地址,可以使用布隆过滤器来存储已知的垃圾邮件发送者邮箱地址。
- 当收到新邮件时,通过布隆过滤器判断发件人邮箱地址是否存在于垃圾邮件发送者列表中,如果存在,则可以初步判断该邮件为垃圾邮件。
- 分布式系统中的元素存在性判断:
- 在分布式系统中,多个节点之间需要共享数据并判断某个元素是否存在。
- 使用布隆过滤器可以在不共享完整数据集的情况下,高效地判断元素是否存在,从而减少网络通信和存储成本。
- 大规模数据去重:
- 在处理大规模数据集时,为了去除重复数据,可以使用布隆过滤器进行初步去重。
- 需要注意的是,由于布隆过滤器的误判特性,去重后可能还需要进行进一步的处理(如使用其他数据结构进行精确去重)。
- API 频率限制:
- 在提供API服务时,为了防止某个用户或IP地址过度请求资源,可以使用布隆过滤器来记录用户或IP地址的请求频率。
- 当用户或IP地址发起请求时,通过布隆过滤器判断其请求频率是否超过了限制,如果超过则拒绝服务
优点
- 空间效率高:
- 布隆过滤器通过位数组和多个哈希函数实现,相比其他数据结构(如散列表),其空间占用更低。位数组的每个元素只占用1bit空间,极大地节省了存储空间。
- 查询效率高:
- 布隆过滤器的查询操作非常快速,因为它只需要对位数组进行简单的位运算,而不需要进行磁盘I/O或复杂的数据结构遍历。查询时间复杂度通常为O(k),其中k为哈希函数的个数,一般较小。
- 可扩展性强:
- 布隆过滤器可以根据需要动态调整位数组的大小和哈希函数的数量,以适应不同规模的数据集。
- 适用于保密场景:
- 布隆过滤器不存储数据本身,只存储数据的哈希值,因此在某些对保密要求较高的场景中(如密码存储、敏感信息过滤等)具有优势。
- 支持交、并、差运算:
- 使用同一组哈希函数的布隆过滤器之间可以进行交、并、差运算,这在处理多个数据集时非常有用。
缺点
- 存在误判率:
- 布隆过滤器最大的缺点是无法准确判断元素是否一定存在,只能判断元素可能不存在或可能存在。由于哈希碰撞的存在,即使元素不在集合中,也可能因为其他元素的哈希值与之相同而被误判为存在。误判率随着元素的增加而增加,但可以通过增加位数组的大小和哈希函数的数量来降低。
- 无法删除元素:
- 布隆过滤器不支持直接删除元素。因为删除一个元素需要将其对应的位数组中的位重置为0,但这可能会影响到其他元素的存在性判断。虽然有些变种布隆过滤器(如Counting Bloom Filter)支持删除操作,但会牺牲一些空间效率和查询效率。
- 不存储元素本身:
- 布隆过滤器只存储元素的哈希值,不存储元素本身。因此,在需要获取元素具体信息时,布隆过滤器无法满足需求。
- 对哈希函数敏感:
- 布隆过滤器的性能受到哈希函数的影响。如果哈希函数设计不当或发生碰撞过多,将会导致误判率上升。
如何降低布隆过滤器的误判率:请参考我的另一篇文章
相关文章:
redis布隆过滤器原理及应用场景
目录 原理 应用场景 优点 缺点 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用位数组和哈希函数来判断一个元素是否存在于集合中。 原理 数据结构: 位数组:一个由0和1组成的数组,初始…...
vue+openlayers之几何图形交互绘制基础与实践
文章目录 1.实现效果2.实现步骤3.示例页面代码3.基本几何图形绘制的关键代码 1.实现效果 绘制点、线、多边形、圆、正方形、长方形 2.实现步骤 引用openlayers开发库。加载天地图wmts瓦片地图。在页面上添加几何图形绘制的功能按钮,使用下拉列表(sel…...
「多模态大模型」解读 | 突破单一文本模态局限
编者按:理想状况下,世界上的万事万物都能以文字的形式呈现,如此一来,我们似乎仅凭大语言模型(LLMs)就能完成所有任务。然而,理想很丰满,现实很骨感——数据形态远不止文字一种&#…...
Redis深度解析:核心数据类型与键操作全攻略
文章目录 前言redis数据类型string1. 设置单个字符串数据2.设置多个字符串类型的数据3.字符串拼接值4.根据键获取字符串的值5.根据多个键获取多个值6.自增自减7.获取字符串的长度8.比特流操作key操作a.查找键b.设置键值的过期时间c.查看键的有效期d.设置key的有效期e.判断键是否…...
C语言 指针和数组——指针的算术运算
目录 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针变量 – 指针类型的变量,保存地址型数据 指针变量与其他类型…...
[C++][CMake][CMake基础]详细讲解
目录 1.CMake简介2.大小写?3.注释1.注释行2.注释块 4.日志 1.CMake简介 CMake是一个项目构建工具,并且是跨平台的 问题 – 解决 如果自己动手写Makefile,会发现,Makefile通常依赖于当前的编译平台,而且编写Makefile的…...
CCD技术指标
CCD尺寸,即摄象机靶面。原多为1/2英寸,现在1/3英寸的已普及化,1/4英寸和1/5英寸也已商品化。CCD像素,是决定了显示图像的清晰程度,。CCD是由面阵感光元素组成,每一个元素称为像素,像素越多&…...
SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存
文章目录 1. 前言2. 缓存2.1 什么是缓存2.2 使用缓存的好处2.3 缓存的成本2.4 Spring Cache和Redis的优点 3. Spring Cache基础知识3.1 Spring Cache的核心概念3.2 Spring Cache的注解3.2.1 SpEL表达式3.2.2 Cacheable3.2.3 CachePut3.2.4 CacheEvict 4. 实现查询数据缓存4.1 准…...
【算法】(C语言):冒泡排序、选择排序、插入排序
冒泡排序 从第一个数据开始到第n-1个数据,依次和后面一个数据两两比较,数值小的在前。最终,最后一个数据(第n个数据)为最大值。从第一个数据开始到第n-2个数据,依次和后面一个数据两两比较,数值…...
iOS项目怎样进行二进制重排
什么是二进制重排 ? 在iOS项目中,二进制重排(Binary Reordering 或者 Binary Rearrangement)是一种优化技术,主要目的是通过重新组织应用程序的二进制文件中的代码和数据段,来提高应用程序的性能ÿ…...
CentOS中使用SSH远程登录
CentOS中使用SSH远程登录 准备工作SSH概述SSH服务的安装与启动建立SSH连接SSH配置文件修改SSH默认端口SSH文件传输 准备工作 两台安装CentOS系统的虚拟机 客户机(192.168.239.128) 服务器(192.168.239.129) SSH概述 Secure S…...
spring @Autowire注解作用
终于有人把Autowired注解讲清楚了,赞!!!_autowired-CSDN博客...
密码学原理精解【5】
这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密: e k ( x ) ( x k ) m o d 26 解密: d k ( x ) ( x − k ) m o d 26 以z_{…...
Unity3D 资源管理YooAsset原理分析与详解
引言 Unity3D 是一款广泛应用于游戏开发、虚拟现实(VR)、增强现实(AR)等领域的强大游戏开发引擎。在开发过程中,资源管理是一项至关重要的任务,它直接影响到游戏的性能和用户体验。YooAsset 是一个基于 Un…...
npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
npm install puppeteer 报错如下: npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated. Use PUPPETEER_DOWNLOAD_BASE_URL instead. npm ERR! Error: ERROR: Failed to set up Chrome v126.0.6478.126! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to sk…...
浙大版PTA《Python 程序设计》题目集 参考答案
浙大版PTA《Python 程序设计》题目集 参考答案 本答案配套详解教程专栏,欢迎订阅: PTA浙大版《Python 程序设计》题目集 详解教程_少侠PSY的博客-CSDN博客 01第1章-1 从键盘输入两个数,求它们的和并输出 aint(input()) # 输入a的值 bint(…...
“拆分盘投资:机遇与风险并存
一、引言 随着互联网技术的日新月异,金融投资领域迎来了前所未有的变革,其中拆分盘作为一种新兴的投资模式,正逐渐进入公众的视野。其独特的价值增长逻辑和创新的投资机制,为投资者开辟了新的财富增值渠道。本文旨在深入探讨拆分…...
Java面试题系列 - 第2天
题目:Java中的线程池模型及其配置策略 背景说明:在Java多线程编程中,线程池是一种高效的线程复用机制,能够有效管理和控制线程的创建与销毁,避免频繁创建和销毁线程带来的性能开销。理解和掌握线程池的配置策略对于优…...
AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!
一、前言 2017年,谷歌团队推出一篇神经网络的论文,首次提出将“自注意力”机制引入深度学习中,这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时,Transformer也随之进入大众视野。一夜之间&…...
QT+OpenCV在Android上实现人脸实时检测与目标检测
一、功能介绍 在当今的移动应用领域,随着技术的飞速发展和智能设备的普及,将先进的计算机视觉技术集成到移动平台,特别是Android系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
