*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: 增加容量或使用更长的指纹(由创建参数控制)。容量越大、指纹越长,碰撞概率越低。