美文网首页
SpringBoot 如何集成 Redis 实现布隆过滤器

SpringBoot 如何集成 Redis 实现布隆过滤器

作者: 呆小鱼LQ | 来源:发表于2023-09-20 00:49 被阅读0次

    前言

    本篇文章的代码示例已放到 github 上,Git地址为:advance(记录每一个学习过程),项目的介绍页面是我所有文章的一个引用目录,大家在引用目录里面即可找到对应文章的一个代码路径。

    大家觉得有用的话,麻烦点个star👍再走呗!

    使用场景

    针对 Redis 的缓存穿透问题,布隆过滤器是一个常见的解决办法。在单机的场景下,我们可以使用谷歌的 guava 包里面提供的布隆过滤器。在分布式的场景下,我们也可以选用 Redis 来实现布隆过滤器。

    虽然,Redis 的 BitMap天然就可以作为 布隆过滤器来实现,但毕竟自己实现的话,还是会有点麻烦。因此,我们可以选用 redisson 提供的布隆过滤器,提高我们的开发效率。

    常用方法

    配置布隆过滤器的Bean

    @Bean
    public RBloomFilter<String>  bloomFilter(){
        // 定义一个布隆过滤器,指定布隆过滤器的名称
        RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloomTest");
        //定义布隆过滤器的大小,以及误差率
        bloomFilter.tryInit(100000L, 0.003);
        return bloomFilter;
    }
    

    获取布隆过滤器

    配置完之后,这个布隆过滤器就在 Spring 容器里面了,可以直接注入进来

    @Autowired
    private RBloomFilter<String> bloomFilter;
    

    添加元素

    String name1 = "小明";
    String name2 = "小张";
    bloomFilter.add(name1);
    bloomFilter.add(name2);
    

    判断布隆过滤器中是否存在某元素

    boolean flag1 = bloomFilter.contains("小明");
    System.out.println("布隆过滤器中是否可能有小明?" + flag1);
    

    获取布隆过滤器的元素总数

    System.out.println("当前布隆过滤器中有多少个数?" + bloomFilter.count());
    

    获取布隆过滤器预计可以插入多少个数

    System.out.println("预计布隆过滤器中可以插入多少个数?" + bloomFilter.getExpectedInsertions());
    

    获取布隆过滤器的容错率

    System.out.println("布隆过滤器的容错率:" + bloomFilter.getFalseProbability());
    

    获取哈希函数的个数

    System.out.println("布隆过滤器哈希哈数的个数:" + bloomFilter.getHashIterations());
    

    获取 Bit 位的个数

    System.out.println("布隆过滤器的bit位有多少个?" + bloomFilter.getSize());
    

    使用示例

    @Component
    public class LineRunner implements CommandLineRunner {
        @Autowired
        private RBloomFilter<String> bloomFilter;
    
        @Override
        public void run(String... args) throws Exception {
            String name1 = "小明";
            String name2 = "小张";
            bloomFilter.add(name1);
            bloomFilter.add(name2);
            boolean flag1 = bloomFilter.contains("小明");
            System.out.println("布隆过滤器中是否可能有小明?" + flag1);
            boolean flag2 = bloomFilter.contains("小李");
            System.out.println("布隆过滤器中是否可能有小李?" + flag2);
            System.out.println("当前布隆过滤器中有多少个数?" + bloomFilter.count());
            System.out.println("预计布隆过滤器中可以插入多少个数?" + bloomFilter.getExpectedInsertions());
            System.out.println("布隆过滤器的容错率:" + bloomFilter.getFalseProbability());
            System.out.println("布隆过滤器哈希哈数的个数:" + bloomFilter.getHashIterations());
            System.out.println("布隆过滤器的bit位有多少个?" + bloomFilter.getSize());
        }
    }
    

    相关文章

      网友评论

          本文标题:SpringBoot 如何集成 Redis 实现布隆过滤器

          本文链接:https://www.haomeiwen.com/subject/uduovdtx.html