*Redis CF.DEL 命令

CF.DEL 从 Cuckoo Filter 中删除一个元素。这是 Cuckoo Filter 相对于 Bloom Filter 的核心优势之一。


*语法

CF.DEL key item

*参数说明

参数 类型 必填 说明
key String Cuckoo Filter 的键名
item String / Bytes 要删除的元素

*返回值

  • 1:删除成功(找到了该元素并移除一个计数)
  • 0:元素不存在于过滤器中(或假阴性)
  • Error:键存在但非 Cuckoo Filter 类型

*时间复杂度

O(1)

*

*示例

*基本用法

> CF.RESERVE mycf 1000
OK
> CF.ADD mycf "user123"
(integer) 1
> CF.COUNT mycf "user123"
(integer) 1
> CF.DEL mycf "user123"
(integer) 1
> CF.COUNT mycf "user123"
(integer) 0

*多次添加后删除

> CF.ADD mycf "item1"
(integer) 1
> CF.ADD mycf "item1"
(integer) 1
> CF.COUNT mycf "item1"
(integer) 2
> CF.DEL mycf "item1"
(integer) 1
> CF.COUNT mycf "item1"
(integer) 1
> CF.DEL mycf "item1"
(integer) 1
> CF.COUNT mycf "item1"
(integer) 0
> CF.DEL mycf "item1"
(integer) 0

*删除不存在元素

> CF.DEL mycf "notexist"
(integer) 0

*常见错误

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

*最佳实践

  • 删除操作是 Cuckoo Filter 的核心优势,适合需要动态增删成员的场景(如黑名单、在线用户集合)
  • 重复添加的元素需多次删除才能完全移除
  • 删除不存在的元素返回 0,不会报错,可安全调用

*FAQ

Q1: CF.DEL 会删除所有重复插入的同一元素吗? A: 不会,每次 CF.DEL 只减少一个计数。如果元素被插入了 N 次,需要调用 N 次 CF.DEL 才能完全删除。

Q2: 删除后其他元素的查询会受影响吗? A: 不会。Cuckoo Filter 的删除是安全的,不会像 Bloom Filter 那样导致其他元素的误判率上升。

Q3: 为什么 Cuckoo Filter 能删除而 Bloom Filter 不能? A: Cuckoo Filter 存储的是元素的指纹(fingerprint),每个桶记录的是具体指纹值,可以精确定位删除。Bloom Filter 仅设置位数组的位,无法区分是哪个元素设置的,因此无法安全删除。