一篇30分钟文章带您掌握布隆过滤器(Redisson)
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇30分钟文章带您掌握布隆过滤器(Redisson)相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
一篇40分钟文章带您掌握布隆过滤器(Redisson)
01布隆过滤器是什么?
简单来说,判断一个元素是否存在于大数据量的集合中,即某样东西一定不存在或者可能存在,因为布隆过滤器有一定的误差率。
02 实战-如何用Redisson实现布隆过滤器
布隆过滤器设计:
/**
* 布隆过滤器
* 使用场景:主要是针对不存在的,进行查询短路操作,避免无效的查询
* author : yangzhenyu
* **/
@Component
@ConfigurationProperties(prefix = "redisson.rbloomfilter", ignoreUnknownFields = true)
public class RbloomFilterUtil {
private static Logger log = LoggerFactory.getLogger(RbloomFilterUtil.class);
public RbloomFilterUtil() {
log.info("=================== 布隆过滤器初始化===================");
}
@Autowired
private RedissonClient redisson;
private RBloomFilter<Long> bloomFilter;
@Value("test")
private String key;
public void setKey(String key) {
this.key = key;
}
//==================================================================================================================
//==================================================================================================================
@PostConstruct
private void initBloomFilter(){
this.bloomFilter = redisson.getBloomFilter(key);
//初始化布隆过滤器:预计元素为10000L,误差率为3%
this.bloomFilter.tryInit(10000L,0.03);
}
public boolean isContains(Long id){
return this.bloomFilter.contains(id);
}
public void put(Long id){
this.bloomFilter.add(id);
}
}
配置:
redisson:
rbloomfilter:
key: redisson.rbloomfilter.key #布隆过滤器key值
初始化:1~10000
/**
* @author yangzhneyu
* 项目启动预处理3
* 作用:springBoot 项目启动预先加载数据
* 通过@Order来排序,数字越小,越先执行
* */
@Component
@Order(3)
public class StartUpRunnerThree implements CommandLineRunner {
private static Logger log = LoggerFactory.getLogger(StartUpRunnerThree.class);
@Autowired
private RbloomFilterUtil rbloomFilterUtil;
@Override
public void run(String... args) throws Exception {
log.info("===================项目启动预处理3【布隆过滤器初始化测试】===================");
Long l= 10000L;
for (Long i = 0L;i<l;i++){
rbloomFilterUtil.put(i);
}
}
}
03 布隆过滤器测试
测试代码:
/**
* 布隆过滤器
* */
@Autowired
private RbloomFilterUtil rbloomFilterUtil;
/**
* 布隆过滤器测试
* */
@ApiOperation(value = "布隆过滤器测试",notes = "布隆过滤器测试")
@ResponseBody
@PostMapping("/rbloomFilter")
public ResponseBo rbloomFilter(String index) {
String msgValue = "rbloomFilter";
long startTime = init(msgValue,index);
try{
String msg = "布隆过滤器过滤结果:"+rbloomFilterUtil.isContains(Long.valueOf(index));
endLog(msgValue,startTime);
return ResponseBo.ok(msg);
}catch (Exception e){
endLogError(msgValue,startTime,e);
return ResponseBo.error("保存失败" + e.getMessage());
}
}
测试:
输入"-1"
输入"8885"
输入"45"
输入"455555555"
通过上述效果证明布隆过滤器搭建成功!!!
04 布隆过滤器适用场景
布隆过滤器可以充当缓存击穿的解决方案。
缓存击穿:前段不断请求一个不再缓存中,也不再数据库中导致大量的请求落到数据库头上,最后造成数据库服务压力暴增。
布隆过滤器可以高效的判断一个元素是否存在一个集合中,因而可以将布隆过滤器用于防缓存击穿设计中。
05 布隆过滤器的缺点
- 在判断元素是否在数据集合的时候,有一定的误判率
- 添加到布隆过滤器中的元素是不可以删除的。
06 布隆过滤器如何扩容
保留原有的布隆过滤器,建立一个更大的,新增数据都放在新的布隆过滤器中,去重的时候检查所有的布隆过滤器。
07 布隆过滤器如何删除
设置过期时间:
@Autowired
private RedissonClient redisson;
redisson.getBloomFilter(key值).expire(时间, 时间类型);
以上是关于一篇30分钟文章带您掌握布隆过滤器(Redisson)的主要内容,如果未能解决你的问题,请参考以下文章