BF.RESERVE
BF.RESERVE key error_rate capacity [EXPANSION expansion] [NONSCALING]
- Available in:
- Redis Stack / Bloom 1.0.0
- Time complexity:
- O(1)
创建一个空的布隆过滤器,具有初始指定容量的单个子过滤器,并具有上限error_rate
。
默认情况下,当达到capacity
时,过滤器通过创建额外的子过滤器来自动扩展。
新的子过滤器的大小是前一个子过滤器的大小乘以expansion
。
尽管过滤器可以通过创建子过滤器来扩展,但建议预留估计所需的capacity
,因为维护和查询子过滤器需要额外的内存(每个子过滤器使用额外的位和哈希函数),并且比在创建时具有正确容量的等效过滤器消耗更多的CPU时间。
最优的哈希函数数量是 ceil(-ln(error_rate) / ln(2))
。
给定所需的error_rate
和最佳哈希函数数量,每个项目所需的位数是-ln(error_rate) / ln(2)^2
。因此,过滤器中所需的位数是capacity * -ln(error_rate) / ln(2)^2
。
- 1% 错误率需要 7 个哈希函数和每个项目 9.585 位。
- 0.1% 的错误率需要10个哈希函数和每个项目14.378位。
- 0.01% 的错误率需要 14 个哈希函数和每个项目 19.170 位。
必需的参数
key
是用于创建的布隆过滤器的键名。
error_rate
期望的误报概率。该比率是一个介于0和1之间的小数值。 例如,对于期望的误报率为0.1%(千分之一),error_rate应设置为0.001。
capacity
预计要添加到过滤器中的条目数量。
如果您的过滤器允许扩展,添加超过此数量的项目后,性能将开始下降。
实际下降程度取决于超出限制的程度。性能随着子过滤器
数量的增加而线性下降。
可选参数
NONSCALING
防止过滤器在达到初始容量时创建额外的子过滤器。
非扩展过滤器比其扩展版本需要稍少的内存。当达到capacity
时,过滤器会返回一个错误。
EXPANSION expansion
当达到capacity
时,会创建一个额外的子过滤器。
新子过滤器的大小是最后一个子过滤器的大小乘以expansion
,指定为正整数。
如果要存储在过滤器中的项目数量未知,您可以使用expansion
为2
或更高来减少子过滤器的数量。
否则,您可以使用expansion
为1
来减少内存消耗。默认值为2
。
返回值
返回以下回复之一:
- Simple string reply -
OK
如果过滤器创建成功 - [] 出错时(无效参数,键已存在等)
示例
redis> BF.RESERVE bf 0.01 1000
OK
redis> BF.RESERVE bf 0.01 1000
(error) ERR item exists
redis> BF.RESERVE bf_exp 0.01 1000 EXPANSION 2
OK
redis> BF.RESERVE bf_non 0.01 1000 NONSCALING
OK