*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 不存在时自动创建过滤器。