*Redis BF.INFO 命令

BF.INFO 返回指定 Bloom Filter 的配置信息和统计信息。


*语法

BF.INFO key

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名

*返回值

返回一个键值对数组,包含以下信息:

  • Capacity:过滤器设计容量(预期最大元素数)
  • Size:过滤器占用的内存大小(字节)
  • Number of filters:内部子过滤器数量(扩容后可能大于 1)
  • Number of items inserted:已插入元素数量
  • Expansion rate:扩容因子(默认 2)

若键不存在,返回错误。


*时间复杂度

O(1)

*

*示例

*基本用法

> BF.RESERVE myfilter 0.01 1000
OK
> BF.INFO myfilter
 1) "Capacity"
 2) (integer) 1000
 3) "Size"
 4) (integer) 1512
 5) "Number of filters"
 6) (integer) 1
 7) "Number of items inserted"
 8) (integer) 0
 9) "Expansion rate"
10) (integer) 2

*添加元素后

> BF.ADD myfilter "user1"
(integer) 1
> BF.ADD myfilter "user2"
(integer) 1
> BF.INFO myfilter
 1) "Capacity"
 2) (integer) 1000
 7) "Number of items inserted"
 8) (integer) 2

*扩容后的多过滤器

> BF.RESERVE expandable 0.01 10 EXPANSION 2
OK
> BF.INSERT expandable ITEMS a b c d e f g h i j k l
> BF.INFO expandable
 1) "Capacity"
 2) (integer) 30
 5) "Number of filters"
 6) (integer) 2

*常见错误

错误 原因 解决
ERR not found key 不存在 确认 key 是否正确,或先用 BF.RESERVE 创建
WRONGTYPE key 不是 Bloom Filter 类型 确认 key 对应的数据结构

*最佳实践

  • 定期监控 Size 和 Number of items inserted,评估内存占用和填充率
  • 当 Number of filters 大于 1 时,说明已发生扩容,此时查询和插入性能会略有下降
  • 结合 Capacity 计算填充率,超过 80% 时建议评估是否需要重建更大容量的过滤器

*FAQ

Q1: Size 字段表示什么? A: Size 表示 Bloom Filter 在内存中占用的总字节数,包括所有内部子过滤器的开销。

Q2: "Number of filters" 为什么可能大于 1? A: 当插入元素超过当前容量且未设置 NONSCALING 时,Bloom Filter 会自动扩容,创建新的子过滤器。每个子过滤器有独立的容量和错误率。

Q3: 可以用 BF.INFO 判断 key 是否存在吗? A: 不建议。键不存在时 BF.INFO 返回错误而非 nil,应使用 Redis 原生 EXISTS 命令判断 key 是否存在。