布隆过滤器是用于判断一个元素是否在集合中。通过一个位数组和N个hash函数实现。(某样东西一定不存在或者可能存在.)
布谷鸟过滤器解决了布隆过滤器无法删除的问题
当一个元素加入布隆过滤器中的时候,会进行如下操作:
当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行如下操作:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
// 创建布隆过滤器对象,指定容量和容错率
BloomFilter<Integer> filter = BloomFilter.create(
Funnels.integerFunnel(),
1500,
0.01);
// 判断指定元素是否存在
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));
Redis v4.0 之后有了 Module(模块/插件) 功能,Redis Modules 让 Redis 可以使用外部模块扩展其功能 。布隆过滤器就是其中的 Module。
docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
docker exec -it redis-redisbloom bash
redis-cli
BF.ADD {key} {item}
BF.EXISTS {key} {item}
BF.MADD {key} {item} [item ...]
。BF.MEXISTS {key} {item} [item ...]
BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion]
expansion
。默认扩展值为2。这意味着每个后续子过滤器将是前一个子过滤器的两倍。(子过滤器,但与初始化时容量合适的等效过滤器相比,它将消耗更多的内存和CPU)127.0.0.1:6379> BF.ADD myFilter java
(integer) 1
127.0.0.1:6379> BF.ADD myFilter javaguide
(integer) 1
127.0.0.1:6379> BF.EXISTS myFilter java
(integer) 1
127.0.0.1:6379> BF.EXISTS myFilter javaguide
(integer) 1
127.0.0.1:6379> BF.EXISTS myFilter github
(integer) 0