布隆过滤器(Bloom Filter)
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
布隆过滤器的基本思想
存储方式也是十分巧妙的,可以采用位数组的方式,不直接存储元素,而是存储元素是否存在的状态,这样就可以节约大量的存储空间~
在取出的时候也是相同道理
Redission 布隆过滤器:
标签:skuBloomFilter,布隆,RBloomFilter,Filter,过滤器,Bloom,public From: https://www.cnblogs.com/xuzhidong/p/16844673.html依赖
<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);