首页/数据/数据库速查/布隆过滤器(RedisBloom)防穿透
Redis 运维与场景124 条

布隆过滤器(RedisBloom)防穿透

用 BF.ADD 标记存在的元素,BF.EXISTS 判断:不存在一定为假(可放心拒绝)、存在可能误判;适合「先过滤再查库」的防穿透场景。

数据库速查数据更新于 2026-10-13

布隆过滤器是什么

布隆过滤器用一组位与多个哈希函数表示「某个元素可能存在」:查询结果为不存在时一定准确,结果为存在时可能误判。把它放在缓存之前做前置过滤,能挡掉大量必定不存在的请求,从而避免无效查询打到数据库,这就是常说的缓存穿透防护。

基本信息

模块需要安装布隆过滤器模块(例如 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一定不存在可直接返回空,无需查库
容量信息过滤器可容纳的元素上限超出后误判率上升,需要扩容重建
元素数量已添加元素个数接近容量时提前规划重建
标准布隆过滤器不支持删除元素:需要删除语义时要改用计数型变体,或定期全量重建。
数据增删后不同步维护过滤器:被删除的数据仍被判定为存在,防穿透效果随时间衰减。

易错点

  • 不预留容量直接添加元素:按默认小容量创建,容量一超误判率立刻上升
  • 把「可能存在」当成精确结果:仍然必须查询真实数据,否则会返回错误内容
  • 期望能删除元素:标准布隆过滤器不支持删除,设计时要考虑重建成本
  • 漏装模块就上线:命令不可用,前置过滤整体失效且容易在高峰期才发现

数据来源与参考

  • RedisBloom 官方文档: BF.ADD
  • RedisBloom 官方文档: Bloom filter

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌