布隆过滤器
1、配置
@Configuration
public class BloomFilterConfig {
@Bean(name = "bf")
// 布隆过滤器需要RedissonClient,所以@ConditionalOnBean来装配
@ConditionalOnBean(RedissonClient.class)
RBloomFilter bloomFilter(RedissonClient redissonClient){
RBloomFilter<Long> sku = redissonClient.getBloomFilter("sku");
boolean b = sku.tryInit(1000, 0.001);
return sku;
}
}
2、实现监听器SpringApplicationRunListener 的running,在容器运行的时候初始化布隆过滤器
/**
* 容器创建后自动重建bloomFilter过滤器
*/
public class BloomFilterListener implements SpringApplicationRunListener {
SpringApplication springApplication;
String[] args;
public BloomFilterListener(SpringApplication springApplication, String[] args) {
this.springApplication = springApplication;
this.args = args;
}
@Override
public void starting() {
System.out.println("run方法第一次执行前");
}
/**
* 容器运行起来
* @param context
*/
@Override
public void running(ConfigurableApplicationContext context) {
// 查看容器中有没有我们需要的布隆过滤器
boolean flag = context.containsBean("skuBloomFilter");
if(flag){
RBloomFilter skuBloomFilter = context.getBean("skuBloomFilter", RBloomFilter.class);
// 先删除
skuBloomFilter.delete();
// 再重建
skuBloomFilter.tryInit(10000, 0.001);
SkuInfoService skuInfoService = context.getBean(SkuInfoService.class);
if(skuInfoService!=null){
List<Long> skus = skuInfoService.getSkusById();
for (Long aLong : skus) {
// 告知 布隆过滤器 商品id
skuBloomFilter.add(aLong);
}
System.out.println("布隆过滤器初始化完成");
}
}
}
}
3、在类路径下创建META-INF目录,在其中创建spring.factories文件
springboot启动的时候回去META-INF目录下找spring.factories文件
org.springframework.boot.SpringApplicationRunListener=com.atguigu.gmall.product.listenser.AppListener
布隆过滤器:
1、结构:实际上是一个位图结构
2、用处:用来查看一个东西是否存在目标群体中。例如:查一件商品是否在数据库中存在,我们定时将商品id存在布隆中,他会根据id散列很多位值,我们验证一个商品是否存在的到时候,他会将我们要验证的商品id散列成很多位,查看这些位置的值是否为1,如果有一个不为1,则这个商品数据库中没有
3、布隆说没有,那就是没有,布隆说有,不一定有,需要验证。