*Redis BF.CARD 命令
BF.CARD 返回 Bloom Filter 中已添加元素的估计数量(基数)。
*语法
BF.CARD key
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Bloom Filter 的键名 |
*返回值
- Integer:已添加元素的估计数量
- 0:键不存在
- Error:键存在但非 Bloom Filter 类型
*时间复杂度
O(1)
*
*示例
*基本用法
> BF.RESERVE myfilter 0.01 1000
OK
> BF.ADD myfilter "a"
(integer) 1
> BF.ADD myfilter "b"
(integer) 1
> BF.ADD myfilter "a"
(integer) 0
> BF.CARD myfilter
(integer) 2
*键不存在
> BF.CARD nonexist
(integer) 0
*大量元素估算
> BF.RESERVE bigfilter 0.001 100000
OK
> BF.INSERT bigfilter ITEMS a b c d e f g h i j
1) (integer) 1
2) (integer) 1
3) (integer) 1
...
> BF.CARD bigfilter
(integer) 10
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 不是 Bloom Filter 类型 | 确认 key 对应的数据结构类型 |
| ERR wrong number of arguments | 缺少 key 参数 | 提供正确的 key |
*最佳实践
- 用于监控 Bloom Filter 的填充程度,评估是否需要扩容或创建新的过滤器
- 返回值是估算值,非精确计数,因为 Bloom Filter 本身不支持精确删除和计数
- 结合 BF.INFO 的 capacity 字段计算填充率:
BF.CARD / Capacity
*FAQ
Q1: BF.CARD 返回的是精确值吗? A: 是近似精确值。由于 Bloom Filter 不支持删除,且每次添加都会被记录,因此在没有哈希冲突误判为"已存在"的情况下,返回值基本准确。但大量冲突后可能略小于实际插入的不同元素数。
Q2: 键不存在时返回什么? A: 返回 (integer) 0。
Q3: 如何计算 Bloom Filter 的填充率?
A: 用 BF.CARD key 除以 BF.INFO key 返回的 Capacity 值。填充率过高会导致误判率上升。