doc: 阅读bloom filter相关文档

This commit is contained in:
asahi
2025-09-22 14:16:28 +08:00
parent 81c1ab11e0
commit df43af8900

View File

@@ -139,6 +139,8 @@
- [Bloom Filter](#bloom-filter)
- [Example](#example-1)
- [Reserving Bloom filters](#reserving-bloom-filters)
- [total size of bloom filter](#total-size-of-bloom-filter)
- [Performance](#performance)
# redis
@@ -2394,4 +2396,26 @@ BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion] [NONSCALING]
- 默认的EXPANSION为2
> 在向filter中添加new sub-filter时相比于前一个filter会为new sub-filter分配更多的hash function
- `NONSCALING`: 如果想要禁用scale可以指定`NONSCALING`。如果达到了initially assigned
- `NONSCALING`: 如果想要禁用scale可以指定`NONSCALING`。如果达到了initially assigned capacityerror rate将会开始增加。
##### total size of bloom filter
bloom filter实际使用的内存大小是根据`a function of choosen error rate`来决定的:
- hash functions的最佳数量为`ceil(-ln(error_rate) / ln(2))`
- 即要求的error_rate越小hash function的数量应该越多
- 在给定期望error_rate和最有hash functions数量的前提下对每个items需要的bits个数为` -ln(error_rate) / ln(2)^2`
- 故而bloom filter需要的bits数量为`capacity * -ln(error_rate) / ln(2)^2`
- 在`1%` error rate的前提下需要`7`个hash functions每个item需要`9.585`bits
- 在`0.1%` error rate的前提下需要`10`个hash functions每个item需要`14.378`bits
- 在`0.01%` error rate的前提下需要`14`个hash fucntions每个item需要`19.170`bits
而相比于bloom filter使用`redis set`来membership testing时需要耗费的内存大小为
```
memory_with_sets = capacity*(192b + value)
```
对于ip地址每个item大概需要在`40 bytes`320bits而在使用error rate为`0.01%`的bloom filter时每个item仅需`19.170`bits
##### Performance
向bloom filter执行插入操作的时间复杂度为`O(K)`,其中`K`为hash functions的数量。
对bloom filter执行存在性检查的时间复杂度为`O(K)`或`O(K*n)`针对stacked filters场景`n`为stacked filters的数量