*Redis BF.MADD 命令

BF.MADD 将多个元素批量添加到 Bloom Filter 中。若 key 不存在则使用默认参数自动创建。


*语法

BF.MADD key item [item ...]

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名
item String / Bytes 要添加的元素,可指定多个

*返回值

返回 Integer 数组,每个元素对应一个输入 item: - 1:该元素是新添加(之前不存在于过滤器中) - 0:该元素可能已存在(或哈希冲突导致误判) - Error:键存在但非 Bloom Filter 类型,或参数错误


*时间复杂度

O(n × k),n 为 item 数量,k 为哈希函数数量。


*示例

*基本用法

> BF.MADD myfilter a b c
1) (integer) 1
2) (integer) 1
3) (integer) 1
> BF.MADD myfilter a d
1) (integer) 0
2) (integer) 1

*自动创建过滤器

> BF.MADD auto_batch x y z
1) (integer) 1
2) (integer) 1
3) (integer) 1
> BF.INFO auto_batch
1) "Capacity"
2) (integer) 100

*大量元素批量添加

> BF.RESERVE batchfilter 0.01 10000
OK
> BF.MADD batchfilter user1 user2 user3 user4 user5
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1

*常见错误

错误 原因 解决
WRONGTYPE key 已存在且不是 Bloom Filter 类型 确认 key 未被其他数据结构占用
ERR wrong number of arguments 未提供任何 item 至少提供一个 item 参数

*最佳实践

  • 批量插入场景优先使用 BF.MADD 或 BF.INSERT,减少网络往返次数(RTT)
  • 如需指定创建参数(ERROR_RATE、CAPACITY),应使用 BF.INSERT 而非 BF.MADD
  • 单次批量元素数量建议控制在 1000 以内,避免命令执行时间过长阻塞 Redis

*FAQ

Q1: BF.MADD 和 BF.INSERT 有什么区别? A: BF.MADD 语法更简单,但无法指定创建参数,只能按默认参数创建;BF.INSERT 支持 ERROR_RATE、CAPACITY 等创建参数和 NOCREATE、NONSCALING 等选项。

Q2: 返回数组长度与输入 item 数量不一致怎么办? A: 正常情况下两者完全一致。若不一致可能是 Redis 版本或模块异常,应检查服务器日志。

Q3: 所有元素都返回 1 是否表示之前过滤器为空? A: 不一定。即使过滤器非空,新元素若确实未插入过也会返回 1。全部返回 1 仅说明这些元素此前未被记录为"可能存在"。