布隆过滤器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/数据库负责最终确认。这个组合就像门口的保安加身份证系统,前者负责快速拦闲人,后者负责严谨核验。

浙公网安备 33010602011771号