大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】

往期内容:

面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文(1)】-CSDN博客

本文为【布隆过滤器八股文合集】初版,后续还会进行优化更新,欢迎大家评论交流~

大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~

布隆过滤器

具体实现

(1)使用开源的谷歌开源工具类Guava

Spring Boot(七十四):集成Guava 库实现布隆过滤器(Bloom Filter)_guava bloomfilter.create 设置-CSDN博客

(2) 开源Redisson的RBloomFilter

(3) Redis官方提供布隆过滤器插件

(4) Redis提供的bitMap,需要自己实现

各自的缺点:

Guava存储在机器当中,只适合单机,不适合分布式环境当中;

Redis插件需要复杂的配置和高成本支持;

Redis的bitMap需要额外自己去实现;

Redisson 连接Redis即可使用

底层原理?/布隆过滤器如何判断那个字段在缓存中的呢?


一种数据结构,用于判断一个元素是否在一个集合中。它是一种概率型算法,能够快速判断一个元素是否在一个集合中,但不能保证 100% 准确。
布隆过滤器通常用于大数据场景中,例如垃圾邮件过滤、网络爬虫中的 URL 去重等。它的优点是快速判断一个元素是否在集合中,时间复杂度为 O(1),空间复杂度为 O(n),可以满足高并发场景的需求。

原理(一个元素多个哈希函数)
将一个元素通过多个哈希函数计算得到多个哈希值,然后将这些哈希值对应到一个长度为 m 的位数组上,将位数组中对应位置置为 1。当判断一个元素是否在集合中时,需要再次计算多个哈希值,然后判断位数组中对应位置是否为 1,如果都为 1 则认为元素在集合中,否则认为元素不在集合中。

或者

①初始化:首先,布隆过滤器会初始化一个位数组,所有位都被设置为0。

②添加元素:当要将一个元素加入到布隆过滤器中时,将该元素通过多个哈希函数计算出多个哈希值,然后将位数组中对应的位置设置为1。

③查询元素:当要查询一个元素是否存在于布隆过滤器中时,将该元素通过相同的哈希函数计算出多个哈希值,然后检查对应的位数组位置是否都为1。如果所有位置都为1,则该元素可能存在于布隆过滤器中;如果存在任何一个位置为0,则该元素一定不存在于布隆过滤器

会发生错误,可能把不存在的认为存在,但是不会把存在的认为不存在。

为什么需要多个hash函数,有多少个bitmap实现的?/ 为什么布隆过滤器为什么要有5个特殊值? 布隆过滤器只有一个特殊值可以吗?

为了降低布隆过滤器的误判率

优点

1. 空间效率高:布隆过滤器只需要使用一个位数组和多个哈希函数来表示集合,相比使用传统的哈希表或者树等数据结构,布隆过滤器的空间占用更小。

2. 查询效率高:布隆过滤器通过多个哈希函数将元素映射到多个位置,所以查询一个元素只需要进行几次位操作,时间复杂度较低。

3. 可扩展性好:布隆过滤器支持动态添加元素,可以根据需要进行扩展。

布隆过滤器有什么缺点?

1、误判:可能将某个不存在的元素判断为存在

“布隆过滤器说某个元素存在,则大概率在。布隆过滤器说某个元素不在,则一定不在”

2、无法删除: 不支持元素的删除:由于多个元素可能映射到同一个位,所以无法准确地删除一个元素,只能通过重新构建布隆过滤器来实现。

布隆过滤器的元素能否删除?

不能,因为删除一个元素会影响其他元素的判断结果

布隆过滤器怎么删除key?

(1)重新构建布隆过滤器( Scalable Bloom Filter 原理 )

流程如下:

① 创建一个新的空布隆过滤器

② 将原布隆过滤器中的所有元素(除了要删除的元素)重新添加到新的布隆过滤器中

③ 用新的布隆过滤器替换原有的布隆过滤器

(2)使用计数器

在原有基础上,加上计数器,当元素加入时,计数器加一,反之,计数器减一。当计数器为零时,key被删除。

布隆过滤器如何提高容错能力?/ 怎么降低误判率 / 布隆过滤器的01数组发生哈希冲突怎么办?

布隆过滤器本质上就是哈希函数 + 位图
减少误判的两种方法:① 增加哈希函数的数量;② 增加位图(位数组)的长度

布隆过滤器如何实现?/ 让你设计布隆过滤器,你会怎么设计?/ 布隆过滤器如何计算?
  1. 初始化一个全 0 的位数组
  2. 定义 k 个独立的哈希函数
  3. 对于每个要插入的元素:

使用 k 个哈希函数计算出 k 个索引

将位数组中对应的 k 个位置设为 1

     4. 查询元素时:

使用 k 个哈希函数计算出 k 个索引

检查位数组中对应的 k 个位置是否全为 1,如果有一个为 0 则表示元素不存在

布隆过滤器如何评估大小?/ 考虑过对于上亿的数据布隆过滤器的数据量会很大吗?

布隆过滤器的主要参数包括:位数组长度m、哈希函数个数k、预计要插入的元素个数n

其中p为预期的最大误判率(一般为: 0.1%或更低 )

m = -(n * ln(p)) / (ln(2)^2)
k = (m/n) * ln(2)

以1亿为例,

m = -(100,000,000 * ln(0.001)) / (ln(2)^2) ≈ 479,430,000

即需要一个长度为约 4.79 亿比特的位数组

计算哈希函数的数量:

k = (m/n) * ln(2) ≈ 7

所以需要使用 7 个相互独立的哈希函数

已知1 字节 = 8 比特

那么位数组所需的存储空间为:
479,430,000 / 8 = 59,928,750 字节

再转换为 GB:
59,928,750 / (1024 * 1024 * 1024) = 55.85 GB

综上所述,对于存储 1 亿个元素,允许 0.1% 最大误判率的布隆过滤器,需要约 55.85 GB 的存储空间。

千万级数据用布隆过滤器初始化的时候 redis 太慢了,有没有什么好方法?

(1)分批初始化

将大量数据分批次进行初始化,每次初始化一部分

这样可以减轻 Redis 单次操作的压力

可以考虑利用多线程或异步任务的方式来加速

(2)使用本地内存初始化

先在本地内存中构建好布隆过滤器

然后一次性将整个布隆过滤器数据同步到 Redis 中

这样可以利用内存的高速计算能力来加速初始化

(3)采用分布式架构

将布隆过滤器拆分到多个 Redis 实例中

每个实例负责部分数据的初始化和查询

这样可以利用分布式计算的优势来提升性能

布隆过滤器在异常情况下,也会出现缓存击穿,怎么考虑的?

使用多级缓存结构:

除了布隆过滤器,还可以使用其他缓存手段,形成多级缓存

当布隆过滤器判断数据不存在时,可以尝试访问其他缓存层

实现布隆过滤器(1.增量数据怎么放入布隆过滤器;2.怎么合并两个布隆过滤器)?

(1)当有新的数据需要加入时,可以采用以下方法:

创建一个新的、更大的布隆过滤器。

将原有的布隆过滤器中的所有数据 hash 并设置到新的布隆过滤器中。

再将新的数据 hash 并设置到新的布隆过滤器中。

(2)合并两个布隆过滤器的具体做法

确保两个布隆过滤器的大小(位数组长度)相同。

对两个布隆过滤器的对应位进行逻辑或操作(OR),得到合并后的新布隆过滤器。

布隆过滤器的缺陷(不能扩容和删除),目前有没有能够利用到的数据结构来做一个替代呢?

(1)可扩容:

Scalable Bloom Filter (SBF):(动态扩容原理)重新计算新的布隆过滤器,将旧的过滤器迁移至新的

(2)可删除:

Counting Bloom Filter (CBF):(计数布隆过滤器)插入的时候,会将该位对应的值+1,删除则减一

场景题:有千万级数据,如何判断一个整数是否存在?

使用布隆过滤器

场景题:10亿数据,5亿内存,如何查找重复元素?

布隆过滤器

场景题:大数据量的情况下如何进行去重?

布隆过滤器

场景题:布隆过滤器使用一年后和一年前相比有什么不同?

元素个数增加,导致误判率上升

需要调整参数来重新控制误判率

内存占用显著增加,可能影响系统性能

 ---------------------------------------------------------------------------------------------------------------

 更多精彩内容以及一手消息请关注公众号:绝命Coding

公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料

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

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

相关文章

数据结构:冒泡排序,选择排序,插入排序,希尔排序的实现分析

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 小新的主页:编程版小新-CSDN博客 1.冒泡排序 1.1算法思想 冒泡排序的基本思想就是&a…

由浅入深,走进深度学习(4)

各位小伙伴大家好,这期内容是深度学习基础的一个进阶,也可以说是夯实一下很多细节内容 个人感受:动手敲一遍,带着思考,会有不一样的感受!!! 代码是比较多的,有很多内容…

全局变量和局部变量

全局变量未初始化,则它的值为0; 局部变量未初始化,则它的值为随机值; 局部变量的作用域是变量所在的局部范围; 全局变量的作用域是整个工程; 生命周期: 变量的生命周期指的是变量从创建到销毁的整个阶段。 局部变量的生…

react实现路由拦截器

1. 路由拦截的概念 路由拦截&#xff1a;在用户导航到某个路由之前&#xff0c;通过某种逻辑来拦截、检查或修改导航行为。它可以用于实现权限控制、身份验证、页面加载前的准备工作等场景。 2. React Router中的路由拦截实现 2.1 使用<Route>组件的render属性 在Rea…

每天一个项目管理概念之关键路径

在项目管理中&#xff0c;关键路径分析&#xff08;Critical Path Method, CPM&#xff09;是计划和控制项目时间表的重要工具。关键路径是项目网络图中从开始到结束的最长路径&#xff0c;它确定了完成整个项目所需的最短时间。任何关键路径上的任务延误都将直接导致整个项目延…

mysql插入blob或longblob的字符串

mysql字段格式是blob的时候&#xff0c;直接插入字符串会异常 insert table (str),values (aaaa)会异常 需要将字符串转为0x格式的16进制字符串才行 aaaa转换之后为61616161 insert table (str),values (0x61616161)java将字符串转16进制字符串 "0x"DatatypeConver…

使用zdppy结合onlyoffice开发第一个网页文档应用

docserver环境搭建 禁用JWT 加载镜像&#xff1a; docker load -i docserver:7运行容器&#xff1a; docker run -itd -p 8080:80 --name docserver -e JWT_ENABLEDfalse --restartalways onlyoffice/documentserver:7.3.2docker run -itd -p 8080:80 --name docserver -…

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人&#xff1a;张一鸣 2012年&#xff1a;梦想的起点&#xff1a;在一个阳光明媚的早晨&#xff0c;北京的一座普通公寓里&#xff0c;一位名叫张一鸣的年轻人坐在电脑前&#xff0c;眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界&#xff0c;让…

如何使用Java实现高效的多线程编程

如何使用Java实现高效的多线程编程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 在当今软件开发领域中&#xff0c;多线程编程是一项关键技能。它能够…

嵌入式实验---实验六 I2C传输实验

一、实验目的 1、掌握STM32F103I2C传输程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、本案例利用I/O端口通过KEY01按键来控制STM32F103R6向24C02写入“hello”&#xff0c;通过另外一个按键KEY02来控制STM32F103R6从24C02读取“hello”&#x…

又一个前后端分离的整合了OpenAI大模型的高并发、高性能和可扩展的项目完结了,写到简历上,嘎嘎强!

大家好&#xff0c;我是冰河~~ 经过四个多月的坚持&#xff0c;《分布式IM即时通讯系统》终于完结了&#xff0c;也感谢大家这四个多月以来的坚持和陪伴&#xff0c;也相信大家在《分布式IM即时通讯系统》专栏中&#xff0c;学到了不少知识和技术。接下来&#xff0c;我们就一…

[C++][设计模式]介绍

目录 1.设计模式1.何为设计模式&#xff1f;2.深入理解面向对象3.软件设计的目标4.三大模式及其特点5.设计模式分类 2.面向对象设计原则1.为什么要面向对象2.重新认识面向对象3.面向对象设计原则4.C对象模型 3.重构1. 重构获得模式(Refactoring to Patterns)2.重构关键技法 4.代…

代码随想录leetcode200题之图论

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题之图论相关题目。 2 训练 题目1&#xff1a;98. 所有可达路径 解题思路&#xff1a;有向图&#xff0c;dfs(fa, node)。 C代码如下&#xff0c; #include <bits/stdc.h>using namespace std;…

归并排序代码

主程序 int main(int argc, char const *argv[]) {int arr[] {9,5,2,7};int n sizeof(arr)/siezof(arr[0]);print_arr(arr,n);//打印数组merge_sort(arr, n);//分类数组print_arr(arr,n);//打印数组return 0; } 归并排序入口 //归并排序入口 void merge_sort(int arr[], in…

一文带你了解集装箱箱号识别原理,OCR识别及深度学习

如果要想知道集装箱箱号识别原理&#xff0c;首先需要知道什么是集装箱号&#xff08;装运出口货物的集装箱箱号&#xff09;标准集装箱箱号由11位编码组成包括三个部分&#xff1a; 第一部分由4位英文字母组成。前三位代码主要说明箱主、经营人&#xff0c;第四位代码说明集装…

【Oracle】实验二 体系结构、存储结构与各类参数

【实验目的】 理解Oracle体系结构了解初始化参数文件以及初始化参数的含义掌握查看三类数据字典视图和动态性能视图的方法 【实验内容】 如何查看初始化参数&#xff1f;有哪几种方法&#xff1f;初始化参数文件有几种&#xff1f;默认的保存位置在哪里&#xff1f;在SQL*Pl…

【开发】内网穿透ztncui搭建私有节点

文章目录 写在前面一键部署ztnuci记录后续 写在前面 前面搭建moon节点转发的确会降低延迟&#xff0c;但是总有出现moon节点解析不成功的例子&#xff0c;于是疯狂寻找答案是为什么&#xff1f;终于在知乎上找到这样一个答案。 一键部署ztnuci 参考这篇很完善的教程和贴心的…

AI味太重怎么办?1个超简单的方法就能解决

我们知道随着GPT技术的迅速发展&#xff0c;解决了我们大部分写作的难题。但是很多小伙伴想必都会遇到同样的问题&#xff0c;就是写出来的文章太正式-我们叫这“AI味”。 这AI味让人感觉内容虽然条理清楚&#xff0c;但就是缺了点人情味&#xff0c;读起来不够亲切。 其实&a…

基于YOLOv5的口罩佩戴检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

简介 在各种工作环境和公共场所,确保人们正确佩戴口罩对个人防护和公共卫生至关重要,尤其是在医疗设施、制造业车间和拥挤的公共交通中。为了满足这一需求,我们开发了一种基于YOLOv5目标检测模型的口罩佩戴检测系统。本项目不仅实现了高精度的口罩佩戴检测,还设计了一个可…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验6 生成树协议STP的功能

一、实验目的 1.验证以太网交换机生成树协议的功能&#xff1b; 2.理解网络环路对网络的负面效应&#xff1b; 3.理解生成树协议的作用。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实…