*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 的关键区别。