布隆过滤器用来判断某个元素是否存在。
使用场景:
解决redis缓存穿透,当判断不存在该数据时,直接返回;
垃圾邮箱过滤;
防止内容的重复推荐;
避免爬取相同的URL等等
基本算法:
给出一个长度是n的数组,元素的值是0或者1;
向布隆过滤器中添加元素时,根据m个hash函数对元素进行运算,得到m个位置;
将这m个位置的元素设置为1;
判断某个元素是否存在时,也是根据m个hash函数进行运算,如果m个位置的元素都为1,说明元素存在,只要某个位置存在一个0,则说明不存在。
由于hash冲突,布隆过滤器可以判断元素一定不存在,但是不能保证一定存在,其存在一定的误判率。
注:图片来自网络
导入jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.18.0</version>
</dependency>
配置类
package com.qfedu.redissontest.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setDatabase(7)
.setRetryInterval(5000)
.setTimeout(10000)
.setConnectTimeout(10000);
return Redisson.create(config);
}
}
测试
@Test
void contextLoads() {
RBloomFilter<Long> bloomFilter = redisson.getBloomFilter("sample");
// 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01
bloomFilter.tryInit(10000L, 0.01);
bloomFilter.add(123L);
bloomFilter.add(234L);
boolean contains = bloomFilter.contains(123L);
System.out.println(contains);
}