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系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
