*Redis BF.MEXISTS 命令

BF.MEXISTS 批量检查多个元素是否可能存在于 Bloom Filter 中。


*语法

BF.MEXISTS key item [item ...]

*参数说明

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

*返回值

返回 Integer 数组,每个元素对应一个输入 item: - 1:该元素可能存在于过滤器中(存在假阳性可能) - 0:该元素一定不存在于过滤器中 - Error:键存在但非 Bloom Filter 类型,或参数错误


*时间复杂度

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


*示例

*基本用法

> BF.RESERVE myfilter 0.01 1000
OK
> BF.MADD myfilter a b c
1) (integer) 1
2) (integer) 1
3) (integer) 1
> BF.MEXISTS myfilter a d e
1) (integer) 1
2) (integer) 0
3) (integer) 0

*缓存穿透防护批量检查

> BF.MEXISTS user_filter user:1001 user:1002 user:9999
1) (integer) 1
2) (integer) 1
3) (integer) 0

*键不存在

> BF.MEXISTS nonexist x y
1) (integer) 0
2) (integer) 0

*常见错误

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

*最佳实践

  • 批量检查场景优先使用 BF.MEXISTS 替代多次 BF.EXISTS,减少 RTT
  • 返回 0 的元素可直接过滤(一定不存在),返回 1 的元素需进一步查询底层存储确认
  • 单次批量元素数量建议控制在 1000 以内

*FAQ

Q1: BF.MEXISTS 和多次调用 BF.EXISTS 效果一样吗? A: 逻辑结果一致,但 BF.MEXISTS 只需一次网络往返,性能更好。

Q2: 返回 1 的元素还需要查数据库吗? A: 需要。Bloom Filter 返回 1 仅表示"可能存在",存在假阳性概率,必须查数据库确认。返回 0 则可直接跳过数据库查询。

Q3: 键不存在时返回什么? A: 返回全 0 数组,表示所有元素都不存在。