布隆过滤器实现
单机版-Guava
引入guava依赖:
com.google.guava
guava
31.0.1-jre
测试:
@Test
public void test2() {
BloomFilter filter = BloomFilter.create(Funnels.integerFunnel(), 100);
System.out.println(filter.mightContain(1));
System.out.println(filter.mightContain(2));
filter.put(1);
filter.put(2);
System.out.println(filter.mightContain(1));
System.out.println(filter.mightContain(2));
}
此外BloomFilter.create方法还可以增加一个误判率的参数,实际guava底层的误判率是0.03
public static BloomFilter create(
Funnel<? super T> funnel, long expectedInsertions) {
return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions
}
Guava中的布隆过滤器只能单机使用,现在互联网公司一般都是分布式。
Redis版布隆过滤器
布隆过滤器解决缓存穿透的流程图如下:
引入redisson依赖:
org.redisson
redisson
3.12.5
布隆过滤器的使用:
@SpringBootTest
class RedisApplicationTests {
private static RedissonClient redissonClient;
private static RBloomFilter
运行结束后,redis中也会存在布隆过滤器的相关配置:
Docker安装RedisBloom
redis在4.0之后有了插件的功能(Module),可以使用外部的扩展功能,可以使用RedisBloom作为redis布隆过滤器插件。
此外也可以使用Docker安装RedisBloom。
docker run -p 6380:6379 -itd --name redis-redisbloom redislabs/rebloom:latest
执行命令:
docker exec -it redis-redisbloom redis-cli
127.0.0.1:6379> BF.ADD newFilter foo
(integer) 1
127.0.0.1:6379> BF.EXISTS newFilter foo
(integer) 1
127.0.0.1:6379> BF.EXISTS newFilter foo1
(integer) 0