*Redis BF.RESERVE 命令

BF.RESERVE 创建一个新的 Bloom Filter,指定预期容量和可接受的假阳性错误率。


*语法

BF.RESERVE key error_rate capacity [EXPANSION expansion] [NONSCALING]

*参数说明

参数 类型 必填 说明
key String Bloom Filter 的键名
error_rate Double 期望的假阳性错误率(范围 0 < rate ≤ 1)
capacity Integer 预期插入的元素数量
EXPANSION Integer 扩容因子,满时新过滤器容量倍数(默认 2)
NONSCALING Flag 禁止自动扩容,超过 capacity 后报错

*返回值

  • OK:创建成功
  • Error:参数无效、键已存在、或内存不足

*时间复杂度

O(1)

*

*示例

*基本用法

> BF.RESERVE myfilter 0.01 1000
OK
> BF.ADD myfilter "hello"
(integer) 1

*高精确度小容量

> BF.RESERVE precise 0.0001 100
OK
> BF.INFO precise
1) "Capacity"
2) (integer) 100

*固定容量(禁止扩容)

> BF.RESERVE fixed 0.01 10 NONSCALING
OK
> BF.INSERT fixed ITEMS a b c d e f g h i j
> BF.ADD fixed "overflow"
(error) ERR non scaling filter is full

*自定义扩容因子

> BF.RESERVE custom 0.01 100 EXPANSION 4
OK

*常见错误

错误 原因 解决
ERR item exists key 已存在 使用新的 key,或先 DEL 旧 key
ERR bad error rate error_rate 超出范围 确保 0 < error_rate ≤ 1
ERR bad capacity capacity 非正整数 传入大于 0 的整数
ERR non scaling filter is full NONSCALING 且已满 去掉 NONSCALING 允许自动扩容,或创建更大容量的过滤器

*最佳实践

  • 生产环境务必先 BF.RESERVE 再插入,避免自动创建的默认参数不符合需求
  • error_rate 越小、capacity 越大,内存占用越高,需在精度和成本间权衡
  • 使用 NONSCALING 时务必确保 capacity 足够,否则写入会失败

*FAQ

Q1: error_rate 具体影响什么? A: error_rate 决定了假阳性误判的概率。设置 0.01 表示约 1% 的不存在元素会被误判为存在。该值直接影响哈希函数数量和位数组大小。

Q2: 实际插入超过 capacity 会怎样? A: 默认会自动扩容(创建新的子过滤器),此时查询需遍历多个子过滤器,性能下降。带 NONSCALING 时则会报错。

Q3: BF.RESERVE 和直接 BF.ADD 自动创建有什么区别? A: BF.RESERVE 可精确控制 errorrate 和 capacity;BF.ADD 在 key 不存在时自动创建的过滤器使用默认参数(errorrate=0.01, capacity=100),可能不满足需求。