一篇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 布隆过滤器的缺点

  1. 在判断元素是否在数据集合的时候,有一定的误判率
  2. 添加到布隆过滤器中的元素是不可以删除的。

06 布隆过滤器如何扩容

 保留原有的布隆过滤器,建立一个更大的,新增数据都放在新的布隆过滤器中,去重的时候检查所有的布隆过滤器。


07 布隆过滤器如何删除

设置过期时间:

    @Autowired
    private RedissonClient redisson;
    redisson.getBloomFilter(key值).expire(时间, 时间类型);

在这里插入图片描述

以上是关于一篇30分钟文章带您掌握布隆过滤器(Redisson)的主要内容,如果未能解决你的问题,请参考以下文章

5分钟搞懂布隆过滤器,掌握亿级数据过滤算法

5分钟搞懂布隆过滤器,掌握亿级数据过滤算法

C++从青铜到王者第二十一篇:哈希的应用之位图布隆过滤器

一篇文章30分钟带您了解分布式锁

图解布隆过滤器,十分钟带你理解什么是布隆过滤器

布隆过滤器及其数学推导