*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。