*Redis BF.EXISTS 命令

BF.EXISTS 检查单个元素是否可能存在于 Bloom Filter 中。


*语法

BF.EXISTS key item

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名
item String / Bytes 要检查的元素

*返回值

  • 1:元素可能存在于过滤器中(存在假阳性可能)
  • 0:元素一定不存在于过滤器中
  • Error:键存在但非 Bloom Filter 类型

*时间复杂度

O(k),k 为 Bloom Filter 的哈希函数数量。


*示例

*基本用法

> BF.RESERVE myfilter 0.01 1000
OK
> BF.ADD myfilter "hello"
(integer) 1
> BF.EXISTS myfilter "hello"
(integer) 1
> BF.EXISTS myfilter "world"
(integer) 0

*假阳性演示(概率性)

> BF.RESERVE smallfilter 0.5 10
OK
> BF.INSERT smallfilter ITEMS a b c d e f g h i j
1) (integer) 1
...
> BF.EXISTS smallfilter "z"
(integer) 1  -- 假阳性!错误率设置过高导致

*与不存在键交互

> BF.EXISTS notexist "item"
(integer) 0

*常见错误

错误 原因 解决
WRONGTYPE key 不是 Bloom Filter 类型 确认 key 对应的数据结构
ERR wrong number of arguments 缺少 item 参数 提供 key 和 item 两个参数

*最佳实践

  • 返回 0 时可绝对信任(元素一定不存在);返回 1 时仅表示"可能存在"
  • 典型场景:缓存穿透防护,先查 Bloom Filter 再查数据库,避免查询肯定不存在的数据
  • 误判率由创建时的错误率参数控制,需根据业务容忍度设定

*FAQ

Q1: BF.EXISTS 返回 1 表示元素一定存在吗? A: 不一定。返回 1 表示元素"可能存在",有一定概率是假阳性(实际不存在但哈希位都被置为 1)。返回 0 则可 100% 确定元素不存在。

Q2: 如何降低误判率? A: 创建过滤器时用 BF.RESERVE 指定更低的错误率(error_rate),或增加容量(capacity)。代价是更高的内存占用。

Q3: BF.EXISTS 和 BF.MEXISTS 有什么区别? A: BF.EXISTS 检查单个元素,返回 1 或 0;BF.MEXISTS 检查多个元素,返回数组,每个元素对应 1 或 0。