Redisson的布隆过滤器
布隆过滤器用来判断某个元素是否存在。
使用场景:
解决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 {@Beanpublic 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);}
}
测试
@Testvoid contextLoads() {RBloomFilter<Long> bloomFilter = redisson.getBloomFilter("sample");// 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01bloomFilter.tryInit(10000L, 0.01);bloomFilter.add(123L);bloomFilter.add(234L);boolean contains = bloomFilter.contains(123L);System.out.println(contains);}