*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),可能不满足需求。