首页 > 其他分享 >面试官:项目中如何实现布隆过滤器?

面试官:项目中如何实现布隆过滤器?

时间:2024-09-25 17:11:52浏览次数:10  
标签:面试官 插件 实现 元素 Redis 布隆 过滤器

谈起“布隆过滤器”相信大家都不陌生,它也算日常面试中的常见面试题了。例如,当面试官在问到 Redis 模块的相关问题时,可能会问到缓存穿透(Redis 四大经典问题之一),而缓存穿透的经典解决方案之一,则是“布隆过滤器”。

但是,对于布隆过滤器是什么?以及布隆过滤器的实现原理?相信大部分同学都能回答个七七八八。当如果被问道:项目当中是如何实现布隆过滤器的?这个时候大部分同学就又回答不上来了,所以今天咱们就来探讨一下这个问题。

1. 什么是布隆过滤器?

布隆过滤器(Bloom Filter)是一种高效的数据结构,由布隆在 1970 年提出。它主要用于判断一个元素可能是否存在于集合中,其核心特性包括高效的插入和查询操作,但存在一定的假阳性(False Positives)可能性。

布隆过滤器实现如下图所示:

根据 key 值计算出它的存储位置,然后将此位置标识全部标识为 1(未存放数据的位置全部为 0),查询时也是查询对应的位置是否全部为 1,如果全部为 1,则说明数据是可能存在的,否则一定不存在

也就是说,如果布隆过滤器说一个元素不在集合中,那么它一定不在这个集合中;但如果它说一个元素在集合中,则有可能是不存在的(存在误差,假阳性)

2.布隆过滤器特征

  1. 高效节省空间:布隆过滤器不存储数据本身,只存储数据对应的哈希比特位,因此占用空间非常小
  2. 快速的插入和查询:插入和查询操作的时间复杂度都为 O(k),其中 k 为哈希函数的个数,这使得布隆过滤器在处理大量数据时非常高效。
  3. 存在假阳性:由于哈希碰撞的可能性,布隆过滤器在判断元素存在时可能会出现误判,即元素实际上不在集合中,但过滤器错误地认为其存在。这种误判率取决于哈希函数的个数和位数组的长度。
  4. 不支持删除操作:一旦一个元素被添加到布隆过滤器中,很难将其准确地删除。因为多个元素可能会共用位数组中的某些位,删除一个元素可能会影响其他元素的判断结果
  5. 灵活性与可配置性:布隆过滤器的误判率、位数组的长度和哈希函数的个数都是可以根据具体应用场景进行调整的,以达到最优的性能和误判率平衡。

3.使用场景

布隆过滤器的主要使用场景有以下几个:

  1. 大数据量去重:可以用布隆过滤器来进行数据去重,判断一个数据是否已经存在,避免重复插入。
  2. 防止缓存穿透问题:可以用布隆过滤器来过滤掉恶意请求或请求不存在的数据,避免对后端存储的频繁访问。
  3. 网络爬虫URL 去重:可以用布隆过滤器来判断 URL 是否已经被爬取,避免重复爬取。

4.布隆过滤器实现

实现布隆过滤器的方法有很多,可以分为以下两类:

  1. 分布式布隆过滤器
    1. 使用 Redis 4.0 之后提供的插件来实现布隆过滤器。
    2. 使用 Redisson 框架实现布隆过滤器。
  2. 单机布隆过滤器
    1. 使用 Google Guava 实现布隆过滤器。
    2. 使用 Java 自带的数据结构 BitSet 来实现布隆过滤器。
    3. 使用 Hutool 框架实现布隆过滤器。

5.项目中具体实现

在项目开发当中,如果使用的是 Redis 4.0+ 版本,我们通常会使用 Redis 布隆过滤器插件来实现布隆过滤器,以下是具体的实现步骤。

1.下载编译RedisBloom插件

git clone https://github.com/RedisLabsModules/redisbloom.git
cd redisbloom
make # 编译redisbloom

编译正常执行完,会在根目录生成一个 redisbloom.so 文件。

2.启用RedisBloom插件

重新启动 Redis 服务,并指定启动 RedisBloom 插件,具体命令如下:

redis-server redis.conf --loadmodule ./src/modules/RedisBloom-master/redisbloom.so

3.创建布隆过滤器

创建一个布隆过滤器,并设置期望插入的元素数量和误差率,在 Redis 客户端中输入以下命令:

BF.RESERVE my_bloom_filter 0.01 100000

4.添加元素到布隆过滤器

在 Redis 客户端中输入以下命令:

BF.ADD my_bloom_filter leige

5.检查元素是否存在

在 Redis 客户端中输入以下命令:

BF.EXISTS my_bloom_filter leige

课后思考

早期 Redis 版本中如何实现布隆过滤器?说说 Redisson 框架实现布隆过滤器的底层原理?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:面试官,插件,实现,元素,Redis,布隆,过滤器
From: https://www.cnblogs.com/vipstone/p/18431747

相关文章

  • 面试官:谈谈你对 IoC 和 AOP 的理解!
    本文摘录自笔者开源的Java学习&面试指南(Github收获146kstar):JavaGuide。这篇文章会从下面从以下几个问题展开对IoC&AOP的解释什么是IoC?IoC解决了什么问题?IoC和DI的区别?什么是AOP?AOP解决了什么问题?AOP的应用场景有哪些?AOP为什么叫做切面编程?AOP实现......
  • 面试官:如何处理内存泄漏问题?我:内存泄漏是什么?
    目录标题什么是内存泄漏?什么是堆栈和堆中的内存泄漏?为什么Java中会发生内存泄漏?如何防止Java中的内存泄漏?一般排查流程在Java中创建应用程序时,开发人员可以使用new关键字在其软件中创建托管对象。不需要在他们的代码中显式删除这些托管对象,因为垃圾收集器负责删......
  • 6.4.3过滤器字符串
    因为OpticStudio记录了它所跟踪的每条光线的历史记录,所以我们可以使用过滤器字符串来轻松地识别满足特定条件的光线。对于一个关于如何使用过滤器字符串的示例,我们可以查看在上一节中加载的“led_model.zmx”文件。在此文件中,对象2表示源体矩形后面的一个反射器。一些光线从这......
  • 面试官:项目中如何实现分布式锁?
    分布式锁(DistributedLock)是一种用于分布式系统中的同步机制,主要是为了防止分布式系统中,多个服务实例同时操作一个共享资源所带来的并发安全问题。分布式锁确保在同一时间只有一个实例操作共享资源,从而保证了数据的安全性。1.分布式锁实现方案分布式锁的实现方案有多种,例如以......
  • 前端面试官常问的问题
    1.说一说cookiesessionStoragelocalStorage区别?从数据存储位置、生命周期、存储大小、写入方式、数据共享、发送请求时是否携带、应用场景这几个方面来回答。1.存储位置:Cookie、SessionStorage、LocalStorage都是浏览器的本地存储。它们的共同点:都是存储在浏览器本地的,它们的......
  • Redis系列补充:聊聊布隆过滤器(go语言实践篇)
    ★Redis24篇集合1介绍布隆过滤器(BloomFilter)是Redis4.0版本之后提供的新功能,我们一般将它当做插件加载到RedisService服务器中,给Redis提供强大的滤重功能。它是一种概率性数据结构,可用于判断一个元素是否存在于一个集合中。相比较之Set集合的去重功能,布隆过滤器空......
  • [Spring]过滤器
    过滤器Filter作为Java三大器之一,在JavaWeb的使用中有很高的地位。所谓过滤器,就是实现了javax.servlet.Filter接口的服务器端程序。Filter有如下几个用处:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpSe......
  • Filter 过滤器和 Listener 监听器
    2、开发步骤3、过滤器执行流程4、过滤器生命周期5、过滤器配置问题6、过滤器链(配置多个过滤器)二、Listener监听器1、ServletContextListener接口2、开发步骤一、Filter过滤器============1、概述当访问服务器资源时,Filter过滤器可以将请求拦截下来,完成一些特殊的......
  • 面试官:post为什么会发送两次请求?
    面试官:post为什么会发送两次请求?原创石杉石杉的架构笔记 2024年07月29日09:30江西26人听过之前有人跟我们说,出去面试的时候,有时候会遇到一些让人头疼的问题,比如有一次去字节面试,面试官就问了一个让他很奇怪的问题:“为啥POST请求有时候会发送两次呢?”这个问题听起来挺玄乎......
  • 面试官问:你如何处理与同事或上级的分歧?【无标题】
    面试官问:你如何处理与同事或上级的分歧?当面试官问你如何处理与同事或上级的分歧,其实面试官的目的是评估你的沟通技巧、冲突解决能力和团队合作的能力。在一起共事,就一定有分歧发生,有争执是正常的,关键是看如何去解决问题。考察的事候选人在面对不同意见时的态度,且能不能有效的......