*Redis CF.INSERT 命令

CF.INSERT 将一个或多个元素添加到 Cuckoo Filter 中,如果过滤器不存在则自动创建。


*语法

CF.INSERT key [CAPACITY capacity] [NOCREATE] ITEMS item [item ...]

*参数说明

参数 类型 必填 说明
key String Cuckoo Filter 的键名
CAPACITY capacity Integer 新过滤器的期望容量(仅在过滤器不存在时生效)
NOCREATE Flag 禁止自动创建过滤器,如果键不存在则返回错误
ITEMS item... String / Bytes 要插入的一个或多个元素

*返回值

返回一个整数数组,每个元素对应一个插入操作的结果:

  • 1:元素成功插入
  • -1:无法插入,因为过滤器已满(需要扩展容量或允许自动扩展)

特殊情况: - Simple error reply:参数数量或类型错误,或者指定了 NOCREATE 但键不存在时返回


*时间复杂度

O(n * (k + i)),其中 n 是元素数量,k 是子过滤器数量,i 是 maxIterations。


*示例

*基本用法(自动创建过滤器)

> CF.INSERT cf CAPACITY 1000 ITEMS item1 item2
1) (integer) 1
2) (integer) 1

*禁止自动创建

> CF.INSERT cf1 CAPACITY 1000 NOCREATE ITEMS item1 item2
(error) ERR not found

*过滤器已满时的插入

> CF.RESERVE cf2 2 BUCKETSIZE 1 EXPANSION 0
OK
> CF.INSERT cf2 ITEMS 1 1 1 1
1) (integer) 1
2) (integer) 1
3) (integer) -1
4) (integer) -1

*批量插入多个元素

> CF.INSERT cf_bulk ITEMS user1 user2 user3 user4 user5
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查是否提供了 ITEMS 和至少一个元素
ERR not found 指定了 NOCREATE 但键不存在 先使用 CF.RESERVE 创建过滤器,或移除 NOCREATE 选项
ERR item exists 键已存在但不是 Cuckoo Filter 类型 使用不同的键名,或删除现有键

*最佳实践

  • 预创建过滤器:对于已知容量的场景,先用 CF.RESERVE 创建过滤器,避免 CF.INSERT 自动创建时使用默认容量(1024)
  • 批量插入:CF.INSERT 支持一次插入多个元素,比多次调用 CF.ADD 更高效
  • CAPACITY 与 NOCREATE 互斥:这两个选项不能同时使用,因为 NOCREATE 禁止创建新过滤器
  • 处理 -1 返回值:当插入返回 -1 时,说明过滤器已满,可考虑删除并重新创建更大容量的过滤器,或允许自动扩展(设置 EXPANSION > 0)
  • 避免重复插入:CF.INSERT 会无条件插入元素,如果需要在元素不存在时才插入,请使用 CF.INSERTNX

*FAQ

Q1: CF.INSERT 和 CF.ADD 有什么区别? A: CF.INSERT 支持一次插入多个元素,并且可以指定 CAPACITY 和 NOCREATE 选项。CF.ADD 只支持插入单个元素,语法更简洁。CF.INSERT 更适合批量操作场景。

Q2: 如果没有指定 CAPACITY,新过滤器会使用多大容量? A: 默认容量是 1024。如果预计插入更多元素,建议显式指定 CAPACITY,因为过滤器在接近填满时会自动扩展(如果 EXPANSION > 0),但扩展会带来性能下降和错误率增加。

Q3: 返回 -1 是什么意思? A: 表示元素无法插入,因为过滤器已满。这通常发生在:1) 容量确实已满;2) EXPANSION 设置为 0 禁止自动扩展;3) 虽然未满但 Cuckoo 交换次数超过 MAXITERATIONS。可以考虑增加容量或调整 MAXITERATIONS。

Q4: CF.INSERT 会覆盖已存在的元素吗? A: Cuckoo Filter 是概率数据结构,不存储实际元素值,只存储指纹。CF.INSERT 总是尝试插入,不关心元素是否已存在。如果需要在元素不存在时才插入,请使用 CF.INSERTNX