zoukankan      html  css  js  c++  java
  • 布隆过滤器实现

    单机版-Guava

    引入guava依赖:

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>31.0.1-jre</version>
            </dependency>
    

    测试:

        @Test
        public void test2() {
            BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(), 100);
    
            System.out.println(filter.mightContain(1));
            System.out.println(filter.mightContain(2));
    
            filter.put(1);
            filter.put(2);
    
            System.out.println(filter.mightContain(1));
            System.out.println(filter.mightContain(2));
        }
    

    此外BloomFilter.create方法还可以增加一个误判率的参数,实际guava底层的误判率是0.03

      public static <T extends @Nullable Object> BloomFilter<T> create(
          Funnel<? super T> funnel, long expectedInsertions) {
        return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions
      }
    

    Guava中的布隆过滤器只能单机使用,现在互联网公司一般都是分布式。

    Redis版布隆过滤器

    布隆过滤器解决缓存穿透的流程图如下:

    image-20211117135824552

    引入redisson依赖:

            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson</artifactId>
                <version>3.12.5</version>
            </dependency>
    

    布隆过滤器的使用:

    @SpringBootTest
    class RedisApplicationTests {
    
        private static RedissonClient redissonClient;
    
        private static RBloomFilter<Object> bloomFilter;
    
        private static long size = 1000000;
    
        private static double fpp = 0.01;
    
        @BeforeAll
        public static void before() {
            Config config = new Config();
            config.useSingleServer().setAddress("redis://xxx.xxx.xxx.xxx").setDatabase(0).setPassword("xxxxxxxx");
            redissonClient = Redisson.create(config);
            bloomFilter = redissonClient.getBloomFilter("myBloomFilter", new StringCodec());
            bloomFilter.tryInit(size, fpp);
            bloomFilter.add("10000");
        }
    
        @Test
        void contextLoads() {
            Assertions.assertTrue(bloomFilter.contains("10000"));
            Assertions.assertFalse(bloomFilter.contains("10001"));
        }
    }
    

    运行结束后,redis中也会存在布隆过滤器的相关配置:

    image-20211117143049631

    Docker安装RedisBloom

    redis在4.0之后有了插件的功能(Module),可以使用外部的扩展功能,可以使用RedisBloom作为redis布隆过滤器插件。

    此外也可以使用Docker安装RedisBloom。

    docker run -p 6380:6379 -itd --name redis-redisbloom redislabs/rebloom:latest
    

    执行命令:

    docker exec -it redis-redisbloom redis-cli
    
    127.0.0.1:6379> BF.ADD newFilter foo
    (integer) 1
    127.0.0.1:6379> BF.EXISTS newFilter foo
    (integer) 1
    127.0.0.1:6379> BF.EXISTS newFilter foo1
    (integer) 0
    
  • 相关阅读:
    冒泡排序
    对于Random.Next()生成随机数重复的问题
    二分法查找
    工厂方法模式
    简单的工厂模式
    unity AssetBundle打包及加载
    关于谷歌不然安装除商店之外的拓展应用解决
    【Unity与23种设计模式】抽象工厂模式(Abstract Factory)
    【Unity与23种设计模式】解释器模式(Interpreter)
    【Unity与23种设计模式】原型模式(Prototype)
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/15567354.html
Copyright © 2011-2022 走看看