*Redis CF.COUNT 命令

CF.COUNT 返回指定元素在 Cuckoo Filter 中的估计计数(插入次数)。


*语法

CF.COUNT key item

*参数说明

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

*返回值

  • Integer:元素的估计插入次数。对于未插入的元素,返回 0 或假阳性误判的小正数
  • Error:键存在但非 Cuckoo Filter 类型

*时间复杂度

O(1)

*

*示例

*基本用法

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

*计数变化

> CF.ADDNX mycf "item1"
(integer) 1
> CF.COUNT 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.RESERVE smallcf 10
OK
> CF.ADD smallcf a b c d e f g h i j
> CF.COUNT smallcf "z"
(integer) 0  -- 大多数情况下为 0

*常见错误

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

*最佳实践

  • 利用 Cuckoo Filter 支持计数和删除的特性,实现频率估计、去重计数等场景
  • 返回值是估计值,非精确计数,因为存在假阳性和指纹碰撞
  • 计数为 0 可较可靠地认为元素未被插入(但不是 100% 确定)

*FAQ

Q1: CF.COUNT 返回的是精确值吗? A: 是近似值。由于指纹碰撞,不同元素可能映射到同一位置,导致计数偏高。但 Cuckoo Filter 的计数比 Bloom Filter 更准确。

Q2: 未插入的元素为什么可能返回大于 0? A: 这是假阳性或指纹碰撞导致。虽然 Cuckoo Filter 的假阳性率较低,但理论上仍可能发生。

Q3: 如何降低计数误差? A: 增加容量或使用更长的指纹(由创建参数控制)。容量越大、指纹越长,碰撞概率越低。