*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 值。填充率过高会导致误判率上升。