guava布隆过滤器及cuckoo过滤器
文档
官方文档
下载地址
说明
- 版本选择:
redis-7.0.0.tar.gz - 下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz
guava布隆过滤器
-
引入依赖
xml<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>26.0-jre</version> </dependency> -
使用示例
javapublic class GuavaBloomFilterDemo { public static void main(String[] args) { // 预期插入数量 100 万,期望误判率 0.01 BloomFilter<String> bloomFilter = BloomFilter.create( Funnels.stringFunnel(StandardCharsets.UTF_8), 1_000_000, 0.01 ); // 添加 bloomFilter.put("192.168.1.100"); bloomFilter.put("10.0.0.1"); // 判断是否存在(可能有误判) System.out.println(bloomFilter.mightContain("192.168.1.100")); // true System.out.println(bloomFilter.mightContain("10.0.0.2")); // 可能 true 或 false // 预期误判率 System.out.println(bloomFilter.expectedFpp()); // 约 0.01 // 近似已插入数量 System.out.println(bloomFilter.approximateElementCount()); } } -
Guava 默认误判率是 0.03,在大多数应用里,3% 误判率是空间效率和准确性的良好平衡。
-
创建时指定预期数量,实际插入超过这个数量会导致误判率急剧上升
-
Guava过滤器不支持删除
cuckoo过滤器
-
引入依赖
xml<dependency> <groupId>com.github.mgunlogson</groupId> <artifactId>cuckoofilter4j</artifactId> <version>1.0.2</version> </dependency> -
使用示例
javapublic class CuckooFilterDemo { public static void main(String[] args) { // 创建:容量 100 万,误判率 1% CuckooFilter<String> filter = new CuckooFilter.Builder<String>( Funnels.stringFunnel(StandardCharsets.UTF_8), 1_000_000 ).withFalsePositiveRate(0.01).build(); // 添加 filter.put("192.168.1.100"); filter.put("10.0.0.1"); // 判断是否存在 System.out.println(filter.mightContain("192.168.1.100")); // true System.out.println(filter.mightContain("10.0.0.2")); // 大概率 false // 删除(支持删除,Bloom过滤器不支持) filter.delete("192.168.1.100"); System.out.println(filter.mightContain("192.168.1.100")); // false } } -
cuckoo过滤器支持删除
-
相关论文:https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf
参考资料
注意事项
- 部分内容由AI生成
- 如有不对,欢迎指正!!!