*Redis CF.EXISTS 命令
CF.EXISTS 检查单个元素是否可能存在于 Cuckoo Filter 中。
*语法
CF.EXISTS key item
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Cuckoo Filter 的键名 |
| item | String / Bytes | 是 | 要检查的元素 |
*返回值
- 1:元素可能存在于过滤器中(存在假阳性可能)
- 0:元素一定不存在于过滤器中(或假阴性,概率极低)
- Error:键存在但非 Cuckoo Filter 类型
*时间复杂度
O(1)
*
*示例
*基本用法
> CF.RESERVE mycf 1000
OK
> CF.ADD mycf "hello"
(integer) 1
> CF.EXISTS mycf "hello"
(integer) 1
> CF.EXISTS mycf "world"
(integer) 0
*删除后检查
> CF.ADD mycf "temp"
(integer) 1
> CF.EXISTS mycf "temp"
(integer) 1
> CF.DEL mycf "temp"
(integer) 1
> CF.EXISTS mycf "temp"
(integer) 0
*键不存在
> CF.EXISTS notexist "item"
(integer) 0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 不是 Cuckoo Filter 类型 | 确认 key 对应的数据结构 |
| ERR wrong number of arguments | 缺少 item 参数 | 提供 key 和 item 两个参数 |
*最佳实践
- 返回 0 时可绝对信任(元素一定不存在或已被删除);返回 1 时仅表示"可能存在"
- 典型场景:缓存穿透防护、黑名单检查、去重判断
- 与 BF.EXISTS 的区别:Cuckoo Filter 支持删除,因此已删除的元素会正确返回 0
*FAQ
Q1: CF.EXISTS 返回 1 表示元素一定存在吗? A: 不一定。返回 1 表示元素"可能存在",有一定概率是假阳性。返回 0 则可 100% 确定元素不存在(或已被删除)。
Q2: CF.EXISTS 和 CF.COUNT 有什么区别? A: CF.EXISTS 只判断存在性(1 或 0),不关心插入次数;CF.COUNT 返回估计的插入次数。两者时间复杂度相同。
Q3: 已删除的元素还会返回 1 吗? A: 不会。Cuckoo Filter 支持安全删除,已删除的元素 CF.EXISTS 会返回 0。这是与 Bloom Filter 的关键区别。