Skip to Content
面试题库Redis[面试题] 什么是布隆过滤器(Bloom Filter)?它的原理是什么?有什么优缺点?

📖 版块 A:知识讲解版 (温故知新)

  • 什么是布隆过滤器:布隆过滤器(Bloom Filter)是由 Howard Bloom 在 1970 年提出的一种空间效率极高的概率型数据结构。它主要用于判断一个元素是否在一个集合中

  • 核心原理

    1. 底层是一个极其巨大的位数组(Bit Array),初始值全为 0。
    2. 当加入一个元素时,使用多个不同的哈希函数(Hash Functions)对该元素进行计算,得到多个哈希值。
    3. 将这些哈希值作为索引,把位数组中对应位置的值都置为 1。
    4. 当查询一个元素是否存在时,同样用这几个哈希函数计算出多个位置,检查这些位置是否全为 1。如果全为 1,说明该元素可能存在;如果只要有一个位置为 0,则说明该元素绝对不存在
  • 优缺点分析

    • 优点:空间效率和查询时间都远超一般算法。位数组非常节省内存(10 亿级的数据只需大约 1.2 GB 内存),且不存储元素本身,具备一定的保密性。

    • 缺点

      1. 存在误判率(False Positive):由于哈希冲突的存在,不同元素可能会把相同的位变成 1。所以布隆过滤器说“在”时,可能其实“不在”。(但说“不在”时,是一定“不在”的)。
      2. 无法删除元素:因为多个元素可能共享同一个位,如果把某个位置 0 来表示删除,就会影响其他元素的判断。

🎤 版块 B:面试实战版 (高手逐字稿)

Q:什么是布隆过滤器?在你们的项目里是怎么用的?能说说它的原理和局限性吗?

💬 高手逐字稿

布隆过滤器本质上是一个概率型的数据结构,我们通常用它来高效地判断一个元素存不存在。在我们的实际项目中,最经典的应用场景就是解决 Redis 的缓存穿透问题

它的底层原理其实非常巧妙。它维护了一个非常长的二进制位数组,初始全是 0。当我们存入一个数据时,比如一个用户 ID,布隆过滤器会用多个不同的哈希函数对这个 ID 进行计算,算出几个不同的哈希值,然后把位数组里这几个对应的位置都标为 1。

当有查询请求过来时,它会用同样的哈希函数算一遍,然后去检查这几个位置是不是都是 1。如果全都是 1,它就会认为这个元素“可能存在”;但只要有一个位置是 0,它就能百分之百确定这个元素“绝对不存在”。

所以布隆过滤器有一个极其著名的特性,叫作:判定存在不一定真存在,但判定不存在那就绝对不存在。

为什么判定存在会有误差呢?这也就是它的第一个局限性——误判率。因为哈希碰撞是无法避免的,有可能查询的这个元素压根没存过,但它算出来的几个位置恰好被其他元素全涂成了 1,这就产生了误报。但这在防缓存穿透场景下是可以接受的,因为它已经帮我们挡住了 99% 以上的无效查询,剩下那点误报穿透到 DB 是完全扛得住的。

除了误判,它还有个致命的缺陷是不支持删除操作。因为多个元素可能会共享同一个二进制位,如果你为了删除元素 A 把某一位变回 0,那可能会连带导致元素 B 也查不到了。如果业务强依赖删除,我们一般只能通过定时重建整个布隆过滤器,或者使用改进版的布谷鸟过滤器(Cuckoo Filter)来替代。

总结来说,在海量数据且允许极小容错率的去重或拦截场景下,布隆过滤器是用极小的内存换取极速查询的神器。

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册