布隆过滤器

布隆过滤器

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、布隆说没有,那就是没有,布隆说有,不一定有,需要验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值