面试知识库
高 进阶

布隆过滤器原理#

一句话答案#

位数组+多个哈希函数:可能存在(有误判)或一定不存在(无漏判),空间高效,用于缓存穿透/URL 去重。

核心要点

原理: 插入时 k 个哈希置 1;查询时全 1 可能存在,有 0 一定不存在

特点: 空间高效 / 有假阳性无假阴性 / 不支持删除

应用: 缓存穿透防护 / URL去重 / HBase避免无效读

面试回答(2分钟版)

布隆过滤器是一个空间效率极高的概率型数据结构,底层是一个位数组加 k 个哈希函数。插入元素时用 k 个哈希函数计算出 k 个位置并置为 1;查询时检查这 k 个位置是否全为 1,全为 1 表示”可能存在”(有误判即假阳性),只要有一个为 0 就”一定不存在”(无漏判)。这个特性使它特别适合做缓存穿透防护:查询前先过布隆过滤器,一定不存在的请求直接拦截不打到数据库。误判率主要靠增大位数组长度(每个元素分到的 bit 数)来降低,哈希函数个数有最优值 k = (m/n)·ln2,不是越多越好,通常设置在 1% 以下就能满足业务需求。布隆过滤器的局限是不支持删除,因为多个元素可能共享同一个 bit 位,置 0 会影响其他元素。如果需要删除可以用 Counting Bloom Filter,每个位置用计数器替代单 bit。和 HashSet 相比,布隆过滤器用极少内存就能判断海量数据的存在性。

追问与易错

追问方向:

  • “布隆过滤器能删除吗?”→ 标准布隆过滤器不支持删除,因为多个元素可能共享同一个 bit 位,置 0 会影响其他元素的判断;需要删除功能可用 Counting Bloom Filter,每个位置用计数器替代单 bit;或改用支持删除的布谷鸟过滤器(Redis 8 自带 CF.* 命令)
  • “误判率怎么控制?”→ 增大位数组长度可降低误判率;哈希函数个数有最优值 k = (m/n)·ln2,过多反而让位数组更快被填满、误判率上升;通常根据预期元素数量和可接受误判率(如 1%,约需 9.6 bit/元素、7 个哈希函数)计算最优参数;Redis 的 BF.RESERVE 命令可直接指定误判率和容量(Redis 8.0 起 Bloom/Cuckoo 等概率数据结构已并入 Redis Open Source 核心,不再需要单独装 RedisBloom 模块;之前需 RedisBloom 模块或 Redis Stack,或用 Redisson 基于 Bitmap 实现)
  • “和 HashSet 比优势?”→ 布隆过滤器空间效率极高,存储 1 亿个元素仅需约 120MB(1% 误判率,约 9.6 bit/元素),HashSet 存同样数据可能需要数 GB;缺点是有误判且不支持删除,只适合判断存在性的场景

易错点:

  • ❌ 布隆过滤器 100% 准确——有假阳性
  • ❌ 可以替代缓存——只能判断存在性