7. 布隆过滤器BloomFilter

2023-10-27

概念

由一个初值都为零的bit数组和多个哈希函数构成,用来快速判断某个数据是否存在(类似set的数据结构,只是统计的结果不太准确)

特点:

  1. 高效的插入和查询,占用空间少,返回的结果是不确定的。
  2. 一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在
  3. 布隆过滤器可以添加元素,但是不能删除元素 因为删除元素会导致误判率增加
  4. 误判只会发生在过滤器没有添加过的元素,对于添加过的元素不会发生误判

布隆过滤器的使用场景:

1.缓存穿透

缓存穿透: 一般情况下,先查询缓存redis是否有该条数据,缓存中没有时,再查询数据库。当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透
当有大量请求查询数据库不存在的数据时,就会给数据库带来压力甚至会拖垮数据库
可以使用布隆过滤器解决缓存穿透的问题:

  1. 把已存在的数据的key存在布隆过滤器中,相当于redis前面挡着一个布隆过滤器
  2. 当有新的请求时,先到布隆过滤器中查询是否存在:
  3. 如果布隆过滤器中不存在该条数据则直接返回:
  4. 如果布隆过滤器已存在,才去查询缓存redis,如果redis里没查询到则穿透到数据库

2.黑名单校验

只要是邮箱在黑名单中的邮件,就识别为垃圾邮件。
把所有黑名单都放在布隆过滤器中,在收到邮件时,判断邮件地址是否在布隆过滤器中即可。

原理

  1. 哈希函数的概念是:将任意大小的输入数据转换成特定大小的输出数据的函数,转换后的数据称为哈希值或哈希编码。
  2. 可能两个不同的值hash出同一个结果,导致hash碰撞
  3. 布隆过滤器是一种专门用来解决去重问题的高级数据结构。
  4. 实质上就是一个大型位数组和几个不同的hash函数。 由一个初值都为零的bit数组和多个哈希函数构成,用来快速判断某个数据是否存在。
    在这里插入图片描述
    在这里插入图片描述
  • 查询某个变量的时候我们只要看到这些点是不是都是1,就可以大概率知道集合中有没有它了。
  • 如果这些点,有任何一个为零,则被查询变量一定不在,如果都是1,则被查询变量很可能存在。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

  1. 使用时最好不要让实际元素数量远大于初始化数量
  2. 当实际元素数量超过初始化数量时,应该对布隆过滤器进行重建,重新分配一个 size 更大的过滤器,再将所有的历史元素批量 add 进行
  3. 是否存在,–有,是很可能有—无,是肯定无,可以保证的是,如果布隆过滤器判断一个元素不在一个集合中,那这个元素一定不会在集合中

布谷鸟过滤器:
支持删除元素,布隆过滤器有以下不足:查询性能弱、空间利用效率低、不支持反向操作(删除)以及不支持计数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7. 布隆过滤器BloomFilter 的相关文章

  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • Cassandra - 使用 ORDER BY 和 UPDATE 集群键的替代方法

    我的架构是 CREATE TABLE friends userId timeuuid friendId timeuuid status varchar ts timeuuid PRIMARY KEY userId friendId CREA
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • 如何使用redis发布/订阅

    目前我正在使用node js和redis来构建应用程序 我使用redis的原因是因为发布 订阅功能 该应用程序只是在用户进入用户或离开房间时通知经理 function publishMsg channel mssage redisClien
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • 如何使用对 Azure 表存储的单个查询检索多种类型的实体?

    我试图了解 Azure 表存储如何创建 facebook 风格的提要 但我陷入了如何检索条目的困境 我的问题几乎和https stackoverflow com questions 6843689 retrieve multiple typ
  • CAP 定理 - 可用性和分区容错性

    当我尝试理解CAP中的 可用性 A 和 分区容错性 P 时 我发现很难理解各种文章的解释 我感觉A和P可以在一起 我知道事实并非如此 这就是为什么我无法理解 简单解释一下 A和P是什么以及它们之间的区别 一致性意味着整个集群中的数据是相同的
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • 如何在Redis中正确存储图片?

    决定将图像存储在Redis中 如何正确执行 现在我这样做 redis gt set image path here is the base64 image code 我不确定这是否正常 将图片存储在Redis中是完全可以的 Redis 键和
  • redis.exceptions.ConnectionError:连接到本地主机时出现错误-2:6379。名称或服务未知

    当我在服务器中运行代码时出现此错误 我的环境是 debian 并且Python2 7 3 Traceback most recent call last File fetcher py line 4 in
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red
  • ArangoDB:(1 个具有多个边缘定义的图)Vs(每个图 1 个边缘定义)

    我想知道在一个图中拥有多个边定义与每个图都有一个边定义相比是否有任何优势 谢谢你的帮助 使用多个边缘定义而不是仅使用一个边缘定义有多种原因 显示内容差异 您可能需要不同的边缘集合bought and watched 不过 这也可以通过使用标
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J

随机推荐

  • 空中跳一跳

    欢迎来到程序小院 空中跳一跳 玩法 跳一跳长按鼠标左键 松开鼠标进行跳跃 跳到下一个格子中 进行分数统计 三次生命机会 格子中也会有爱心出现 吃掉安心增加一次生命哦 开始游戏https www ormcc com play gameStar
  • SourceGraph的使用

    sourcegraph作为一款chrome插件 博主某天不小心在知乎上了解到这个东西之后便本着程序员一颗爱鼓捣的心下载试了试 这个小插件还真不算小 好几MB 但是用起来真的舒服 每次用github的时候是否为出现进目录很麻烦 不想弄得时候
  • 解决第一点击覆盖物Marker显示infowindow,第二次点击隐藏infowindow问题(13行代码)

    如果不想看分析 可以直接复制代码取用 亲测有效 aMap setOnMarkerClickListener new AMap OnMarkerClickListener Override public boolean onMarkerCli
  • 【华为OD机试真题 Python语言】107、 查找重复代码

    文章目录 一 题目 题目描述 输入输出 样例1 样例2 二 思路参考 三 代码参考 作者 鲨鱼狼臧 个人博客首页 鲨鱼狼臧 专栏介绍 2023华为OD机试真题 使用Python进行解答 专栏每篇文章都包括真题 思路参考 代码分析 订阅有问题
  • Android 动态更新Menu菜单

    1 需求描述 Android Menu菜单是比较常见的功能 在ActionBar or ToolBar上显示 点击更多 3个点 会有下拉列表菜单展示 在工作项目中有个小需求改动 在 ToolBar上添加一个图标 点击后会切换图标状态 界面也
  • 如何利用python解方程_Python 解方程的三种方法

    首发于我的博客 The North 新年第一篇 搞起 这回写一个好久之前想做 一直搁着没做的东西 Python 解方程 其实是放假回家 趁着家里电脑重装 LOL 的时间过来写一篇 咱这回用三种不同的方法 来应对平常碰到的简单方程 Numpy
  • SpringBoot自定义数据源

    在SpringBoot中 我们可以自定义数据源以后就可以通过更改配置文件来替代复杂的代码文件 首先我们需要引入maven文件
  • 【VUE基础知识】

    VUE基础知识 代码基本结构 每一个vue文件由三部分组成 template script style 分别对应html js css 另外需要注意的是 template中只允许有一个块状元素 通常情况下是div 其他所有元素的标签都在这个
  • DVWA 三个等级的XSS

    XSS DOM LOW 这个难度极其简单 直接url注入一个scrip的命令 default medium 首先 用low的情况加个大小写混写 看看情况 default 结果 结果直接把我的代码给去掉了 再猜一下别的代码 default i
  • video thumbnails

    http www cyberciti biz tips howto linux creating a image thumbnails from shell prompt html http forum xbmc org showthrea
  • 超实用AI工具汇总

    如今 AI 已经渗透到我们生活的方方面面 很多集成AI的工具也发挥出了类人甚至超越人类的效用 下面本人就使用经历分享一些实用的 AI 工具 辅助大家提升工作效率和生活满意度 一 DOWNNI 其实很多时候可以看到某一些短视频想要保存起来 但
  • Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]

    Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系统启动之Zygote进程Android 10 0 系统启动之SystemSe
  • 博彦科技:区块链建立优质农产品“信任链”

    公众号对话框回复 阳光农安 获取演讲材料 自古以来 我国就是一个农业大国 农业整体发展状况对社会安定 国民经济增长都起着十分重要的作用 如今 在多方共同推动下 我国农业正向着精准化 智慧化方向转型升级 农业发展的质量和效益也得到了新的提升
  • gpt3是什么?和你有关系吗

    GPT 3 是一种大规模的自然语言处理模型 由OpenAI开发 它可以帮助用户解决自然语言处理任务 包括文本生成 问答 机器翻译等 与我相关 GPT 3 可以帮助我更好地理解自然语言 从而更好地回答用户的问题
  • SpringBoot 打包异常:Unable to find main class

    打包出现 原因是我service 工程没有 main 启动类 但是 pom 文件里有打包的依赖 去掉就行了
  • qtablewidget 设置列宽行高遇到的问题

    1 设置行高和列宽后 点击网格线不完整的item时候 item不触发 滚动条滚动 1 隐藏最后空列 有标题最后一行自动拉伸 2 ui QTableWidget gt horizontalHeader gt setStretchLastSec
  • 【python】冒泡法--详细讲解(python实现)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 python 冒泡法详解 python
  • 怎么复制Vmware虚拟机文件到其他的机器、别的硬盘目录

    Vmware虚拟机安装完之后有的时候需要挪动 备份虚拟机文件 比如 从公司电脑复制到家里电脑 或者将已安装好的虚拟机拷贝给同事使用 或者原来磁盘空间满了需要换一个磁盘等等 Vmware提供了相应的迁移和复制分发机制 避免了我们再次安装虚拟机
  • ubuntu 使用apt-get install安装特定版本 (boost)

    比如 安装libboost atomic1 58 可以使用aptitude search boost grep 1 58 查询 然后执行sudo apt get install libboost atomic1 58 dev 就可以进行安装
  • 7. 布隆过滤器BloomFilter

    概念 由一个初值都为零的bit数组和多个哈希函数构成 用来快速判断某个数据是否存在 类似set的数据结构 只是统计的结果不太准确 特点 高效的插入和查询 占用空间少 返回的结果是不确定的 一个元素如果判断结果为存在的时候元素不一定存在 但是