布隆过滤器是什么
布隆过滤器用一组位与多个哈希函数表示「某个元素可能存在」:查询结果为不存在时一定准确,结果为存在时可能误判。把它放在缓存之前做前置过滤,能挡掉大量必定不存在的请求,从而避免无效查询打到数据库,这就是常说的缓存穿透防护。
基本信息
| 模块 | 需要安装布隆过滤器模块(例如 RedisBloom) |
|---|---|
| 建表命令 | BF.RESERVE 键 误判率 容量 |
| 添加与查询 | BF.ADD 与 BF.EXISTS,支持批量版本 |
| 查看信息 | BF.INFO 返回容量、元素数与误判率等 |
| 误判方向 | 只会误判为存在,不会误判为不存在 |
典型使用场景
- 抵御缓存穿透:恶意或不存在的键先被过滤器挡掉,保护数据库
- 防止重复写入:已处理过的标识先查过滤器,降低重复计算
- 爬虫去重:已抓取的地址加入过滤器,避免重复抓取
- 用户注册重名校验:作为前置快速过滤,命中后再查真实数据
- 限流辅助:统计维度较大的场景用过滤器先做一层粗筛
基本用法
基本用法
BF.RESERVE users:bf 0.01 1000000 # 误判率 1%,容量 100 万
BF.ADD users:bf user:1001 # 添加元素
BF.MADD users:bf user:1002 user:1003 # 批量添加
BF.EXISTS users:bf user:1001 # 返回 1,可能存在
BF.EXISTS users:bf user:9999 # 返回 0,一定不存在
BF.INFO users:bf # 查看容量、已用元素数与实际误判率
BF.CARD users:bf # 已添加元素个数返回逐项读法
| 返回 | 含义 | 处理方式 |
|---|---|---|
| 1 | 可能存在 | 仍需查询真实数据确认 |
| 0 | 一定不存在 | 可直接返回空,无需查库 |
| 容量信息 | 过滤器可容纳的元素上限 | 超出后误判率上升,需要扩容重建 |
| 元素数量 | 已添加元素个数 | 接近容量时提前规划重建 |
标准布隆过滤器不支持删除元素:需要删除语义时要改用计数型变体,或定期全量重建。
数据增删后不同步维护过滤器:被删除的数据仍被判定为存在,防穿透效果随时间衰减。