*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 仅设置位数组的位,无法区分是哪个元素设置的,因此无法安全删除。