*Redis CF.ADDNX 命令
CF.ADDNX 仅在元素不存在于 Cuckoo Filter 时添加该元素(Add if Not eXists)。若 key 不存在则自动创建。
*语法
CF.ADDNX key item
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Cuckoo Filter 的键名 |
| item | String / Bytes | 是 | 要添加的元素 |
*返回值
- 1:元素之前不存在,添加成功
- 0:元素已存在(或假阳性误判为存在),未添加
- Error:键存在但非 Cuckoo Filter 类型,或过滤器已满
*时间复杂度
O(n),通常接近 O(1)。
*示例
*基本用法
> CF.ADDNX mycf "user123"
(integer) 1
> CF.ADDNX mycf "user123"
(integer) 0
> CF.COUNT mycf "user123"
(integer) 1
*去重场景
> CF.ADDNX dedup "event1"
(integer) 1
> CF.ADDNX dedup "event2"
(integer) 1
> CF.ADDNX dedup "event1"
(integer) 0
*首次创建
> CF.ADDNX newcf "first"
(integer) 1
> CF.INFO newcf
1) "Size"
2) (integer) 512
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 已存在且不是 Cuckoo Filter 类型 | 确认 key 对应的数据结构 |
| ERR key is full | 过滤器已满 | 创建更大容量的过滤器 |
*最佳实践
- 用于需要去重的场景(如事件去重、URL 去重),确保每个元素只被处理一次
- 返回 0 时不一定表示元素确实存在,可能是假阳性误判
- 与 CF.ADD 的区别:CF.ADD 总是增加计数,CF.ADDNX 在元素"已存在"时不增加
*FAQ
Q1: CF.ADDNX 返回 0 表示元素一定存在吗? A: 不一定。返回 0 可能是因为元素确实已存在,也可能是假阳性误判。Cuckoo Filter 与 Bloom Filter 一样存在假阳性。
Q2: CF.ADDNX 和 CF.ADD 再 CF.COUNT=1 有什么区别? A: CF.ADDNX 是原子操作,并发安全;而 CF.ADD + CF.COUNT 判断需要两次网络往返且非原子。
Q3: 可以用 CF.ADDNX 实现精确去重吗? A: 不能 100% 精确,因为存在假阳性。返回 0 时元素实际上可能并不存在。对精确性要求极高的场景需配合数据库二次确认。