*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.ADDCF.COUNT=1 有什么区别? A: CF.ADDNX 是原子操作,并发安全;而 CF.ADD + CF.COUNT 判断需要两次网络往返且非原子。

Q3: 可以用 CF.ADDNX 实现精确去重吗? A: 不能 100% 精确,因为存在假阳性。返回 0 时元素实际上可能并不存在。对精确性要求极高的场景需配合数据库二次确认。