布隆过滤器Bloom Filter

布隆过滤器Bloom Filter

布隆过滤器(Bloom Filter)可以简单理解为:

一个非常省内存的“存在性检查器”,它能告诉你:这个东西一定不存在,或者可能存在。

它常用于过滤大量无效请求,比如缓存穿透防护。


1. 它解决什么问题?

假设你有一个用户系统:

请求
 ↓
查询 Redis
 ↓
查询 MySQL

有人不断请求:

user?id=999999
user?id=888888
user?id=777777

这些用户根本不存在。

如果每次都查数据库:

请求 → Redis没有 → MySQL查询 → 没有结果

数据库会被无意义请求拖垮。

布隆过滤器放在前面:

请求
 ↓
Bloom Filter
 ↓
不存在?
  |
  +--- 是 → 直接拒绝
  |
  +--- 可能存在 → 查询Redis/MySQL

2. 它内部是什么?

布隆过滤器主要由:

位数组 + 多个哈希函数

组成。

比如有一个长度为 10 的数组:

位置:
0 1 2 3 4 5 6 7 8 9

值:
0 0 0 0 0 0 0 0 0 0

加入一个数据:

"redis"

经过几个哈希函数:

hash1(redis)=2
hash2(redis)=5
hash3(redis)=8

于是:

0 0 1 0 0 1 0 0 1 0

表示:

2、5、8位置被占用

现在查询:

"redis"

再次计算:

2、5、8

发现都是:

1

所以:

redis 可能存在

3. 为什么只能说“可能存在”?

因为不同数据可能碰巧映射到相同位置。

例如:

加入:

A

占用了:

2、5、8

加入:

B

占用了:

1、5、9

现在查询:

C

它刚好也是:

2、5、9

布隆过滤器看到:

这些位置都是1

于是说:

C可能存在

但实际上:

C从未加入

这叫:

误判(假阳性)


4. 它不会出现什么错误?

它不会把存在的数据判断成不存在。

也就是说:

真实情况:

用户A存在

布隆过滤器:

一定不会说不存在

但:

用户B不存在

可能会说:

可能存在

所以:

情况 结果
数据真的不存在 一定不存在 或 偶尔误判存在
数据真的存在 一定判断存在

5. 和 Redis Set 对比

假设存 1 亿个用户 ID:

Redis Set:

{
10001,
10002,
10003...
}

优点:

  • 100%准确

缺点:

  • 占内存大

Bloom Filter:

010010101001010101

优点:

  • 占内存极小
  • 查询很快

缺点:

  • 有误判

6. 常见应用

缓存穿透防护

最经典:

请求
 ↓
Bloom Filter
 ↓
不存在
 ↓
直接返回

爬虫 URL 去重

爬虫抓网页:

http://a.com
http://b.com
http://c.com

判断:

“这个 URL 有没有抓过?”

不用保存全部字符串,只保存 Bloom Filter。


垃圾邮件过滤

判断:

这个邮箱地址是否在黑名单里?

一句话总结:

布隆过滤器就是一个“省内存的集合”,它牺牲一点准确性,换取极快的查询速度和极低的空间占用。它最擅长回答:“这个东西肯定没有,还是可能有?”

在 Redis 场景里,它通常和 Set 配合:Bloom Filter 负责挡掉大部分不存在的数据,Set/数据库负责最终确认。这个组合就像门口的保安加身份证系统,前者负责快速拦闲人,后者负责严谨核验。

posted @ 2026-08-11 09:55  畅畅c  阅读(3)  评论(0)    收藏  举报