*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 是必传关键字,用于分隔选项参数和要插入的元素列表。