*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 仅说明这些元素此前未被记录为"可能存在"。