*Redis BF.ADD 命令

BF.ADD 将单个元素添加到 Bloom Filter 中。


*语法

BF.ADD key item

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名
item String / Bytes 要添加的元素

*返回值

  • 1:元素为新添加(之前不存在于过滤器中)
  • 0:元素可能已存在(或哈希冲突导致误判)
  • Error:键存在但非 Bloom Filter 类型,或参数错误

*时间复杂度

O(k),k 为 Bloom Filter 的哈希函数数量(由 reserve 时的错误率决定)。


*示例

*基本用法

> BF.ADD myfilter "user123"
(integer) 1
> BF.ADD myfilter "user123"
(integer) 0
> BF.ADD myfilter "user456"
(integer) 1

*自动创建过滤器(非 reserve 场景)

> BF.ADD auto_filter "item1"
(integer) 1
> BF.INFO auto_filter
 1) "Capacity"
 2) (integer) 100
 3) "Size"
 4) (integer) 128
 ...

*检查元素是否存在

> BF.EXISTS myfilter "user123"
(integer) 1
> BF.EXISTS myfilter "notexist"
(integer) 0

*常见错误

错误 原因 解决
WRONGTYPE key 已存在且不是 Bloom Filter 类型 确认 key 未被其他数据结构占用
ERR not found 使用非自动创建模式且 key 不存在 先用 BF.RESERVE 创建过滤器
ERR wrong number of arguments 缺少 item 参数 确保提供 key 和 item 两个参数

*最佳实践

  • 生产环境建议先用 BF.RESERVE 显式创建过滤器,指定预期容量和错误率,避免自动创建的默认参数不符合需求
  • Bloom Filter 存在误判率(假阳性),适用于允许误判的场景(如缓存穿透防护)
  • 单过滤器容量建议根据实际数据量设定,避免频繁扩容

*FAQ

Q1: BF.ADD 返回 0 表示元素一定存在吗? A: 不一定。返回 0 有两种可能:元素确实已存在,或发生了假阳性误判。Bloom Filter 的特性是"可能存在"或"一定不存在"。

Q2: 能否向已满的 Bloom Filter 继续添加元素? A: 可以添加,但会显著增加误判率。建议根据预期数据量用 BF.RESERVE 预留足够容量。

Q3: BF.ADD 和 BF.INSERT 有什么区别? A: BF.ADD 只能添加单个元素,且不能带创建参数;BF.INSERT 可批量添加多个元素,并支持在 key 不存在时自动创建过滤器。