布隆过滤器:快速判断某个元素是否存在
特点:高效、空间占用小、允许一定误判
布隆过滤器在 Redis 里的实现机制,核心就是:
-
用一个大位图(bitmap)来表示集合
位图长度 = m
初始值都是 0
插入元素时 -
通过 k 个不同的哈希函数,对元素做哈希
每个哈希结果 % m 得到一个索引位置
用 SETBIT bitmap index 1 把这些位置标记为 1 -
查询元素时
同样计算 k 个哈希位置
用 GETBIT bitmap index 检查这些位置是否都是 1
如果有任何一个位置是 0 → 一定不存在
如果全部是 1 → 可能存在(有误判风险)
🌍 常见使用场景
-
网页爬虫的 URL 去重
爬虫在抓取网页时,需要判断某个 URL 是否已经访问过。
如果用哈希表存储所有 URL,内存消耗会非常大。
使用布隆过滤器可以快速判断 URL 是否可能访问过,大幅减少存储开销。 -
缓存穿透问题
在缓存(如 Redis)+ 数据库架构中,如果用户频繁请求数据库中不存在的 key,会导致请求直接打到数据库(缓存穿透)。
解决方案:在缓存前加一层布隆过滤器,快速判断 key 是否可能存在,不存在则直接拦截。 -
黑名单/白名单过滤
比如:垃圾邮件系统、恶意 IP 拦截、用户黑名单等。
不需要存储所有黑名单,只需用布隆过滤器判断某个 IP/邮箱是否可能在名单中。 -
数据库或存储系统加速
HBase、LevelDB、RocksDB 都在内部使用布隆过滤器。
用于快速判断某个 key 是否在某个文件或存储块中,避免不必要的磁盘 IO。 -
推荐系统/广告系统去重
例如:广告推荐时,需要判断某个用户是否已经看过某条广告。
使用布隆过滤器可以快速判断,避免重复推荐。