布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)

​ 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

布隆过滤器的基本思想

存储方式也是十分巧妙的,可以采用位数组的方式,不直接存储元素,而是存储元素是否存在的状态,这样就可以节约大量的存储空间~

在取出的时候也是相同道理

Redission 布隆过滤器:

依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
 <dependency>
     <groupId>org.redisson</groupId>
     <artifactId>redisson-spring-boot-starter</artifactId>
     <version>3.17.6</version>
 </dependency>

配置类(配置redis和布隆过滤器相关)

@Configuration
public class BloomFilterConfig {
    @Autowired
    public RedissonClient redissonClient;

    @Bean
    public RBloomFilter skuBloomFilter(){
        //指定布隆过滤器的名称
        RBloomFilter<Long> bloomFilter=redissonClient.getBloomFilter(RedisConst.BLOOM_SKU_ID);
        //初始化布隆过滤器大小与容错率
        bloomFilter.tryInit(10000,0.001);
        return bloomFilter;
    }
}

开启一个定时任务向布隆过滤器中添加数据(利用一个请求来模仿的定时任务)

@RestController
@RequestMapping("/init")
public class BloomController {
    @Autowired
    private SkuInfoService skuInfoService;
    @Autowired
    private RBloomFilter skuBloomFilter;
    //TODO 定时任务 同步数据库与布隆过滤器的内容
    @GetMapping("/sku/bloom")
    public String skuBloom() {
        //如果数据库有变化
        skuBloomFilter.delete();
        //初始化布隆过滤器大小与容错率
        skuBloomFilter.tryInit(10000,0.001);

        //1.加载数据库中所有的id
        QueryWrapper<SkuInfo> wrapper = new QueryWrapper<>();
        wrapper.select("id");
        List<SkuInfo> skuInfoList = skuInfoService.list(wrapper);
        for (SkuInfo skuInfo : skuInfoList) {
            Long skuId = skuInfo.getId();
            //把它放入过滤器中
            skuBloomFilter.add(skuId);
        }
        return "success";
    }
}

在业务中使用

 @Autowired
    private RBloomFilter skuBloomFilter
    
    
boolean flag = skuBloomFilter.contains(skuId);
posted @ 2022-10-31 16:08  鸽宗  阅读(88)  评论(0编辑  收藏  举报