*Redis BF.INSERT 命令
BF.INSERT 将多个元素添加到 Bloom Filter 中,支持在 key 不存在时自动创建过滤器。
*语法
BF.INSERT key [ERROR_RATE error_rate] [CAPACITY capacity] [EXPANSION expansion]
[NOCREATE] [NONSCALING] ITEMS item [item ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Bloom Filter 的键名 |
| ERROR_RATE | Double | 否 | 期望的假阳性错误率(默认 0.01,即 1%) |
| CAPACITY | Integer | 否 | 预期插入的元素数量(默认 100) |
| EXPANSION | Integer | 否 | 扩容因子,当容量满时新过滤器容量倍数(默认 2) |
| NOCREATE | Flag | 否 | 若 key 不存在,不自动创建,返回错误 |
| NONSCALING | Flag | 否 | 禁止自动扩容,超过容量后返回错误 |
| ITEMS | Keyword | 是 | 标记后续为元素列表 |
| item | String / Bytes | 是 | 要添加的元素,可多个 |
*返回值
返回 Integer 数组,每个元素对应一个输入 item: - 1:该元素是新添加(之前不存在于过滤器中) - 0:该元素可能已存在(或哈希冲突导致误判) - Error:参数错误、NOCREATE 但 key 不存在、或非 Bloom Filter 类型
*时间复杂度
O(n × k),n 为 item 数量,k 为哈希函数数量。
*示例
*自动创建并插入
> BF.INSERT myfilter ITEMS a b c
1) (integer) 1
2) (integer) 1
3) (integer) 1
> BF.INSERT myfilter ITEMS a d
1) (integer) 0
2) (integer) 1
*带参数创建
> BF.INSERT bigfilter ERROR_RATE 0.001 CAPACITY 100000 ITEMS user1 user2 user3
1) (integer) 1
2) (integer) 1
3) (integer) 1
> BF.INFO bigfilter
1) "Capacity"
2) (integer) 100000
*NOCREATE 模式
> BF.INSERT nofilter NOCREATE ITEMS a
(error) ERR not found
> BF.RESERVE nofilter 0.01 100
OK
> BF.INSERT nofilter NOCREATE ITEMS a
1) (integer) 1
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR not found | 带 NOCREATE 但 key 不存在 | 去掉 NOCREATE 或先创建过滤器 |
| WRONGTYPE | key 不是 Bloom Filter 类型 | 确认 key 对应的数据结构 |
| ERR wrong number of arguments | ITEMS 后未提供元素 | 确保 ITEMS 关键字后至少有一个 item |
*最佳实践
- 批量插入优先使用 BF.INSERT(一次网络往返),而非多次 BF.ADD
- 首次创建时显式指定 ERROR_RATE 和 CAPACITY,避免使用默认值
- 对容量确定性高的场景使用 NONSCALING,避免不可预期的内存增长
*FAQ
Q1: BF.INSERT 和 BF.ADD 有什么区别? A: BF.INSERT 支持批量插入和自动创建,可带创建参数(ERROR_RATE、CAPACITY 等);BF.ADD 只能插入单个元素,使用默认参数自动创建。
Q2: 返回数组中的 0 表示元素之前一定存在吗? A: 不一定。0 表示元素"可能已存在",可能是假阳性误判。Bloom Filter 的特性决定了无法 100% 确认元素是否真正被插入过。
Q3: 可以不带 ITEMS 关键字吗? A: 不可以。ITEMS 是必传关键字,用于分隔选项参数和要插入的元素列表。