Redis中布隆过滤器的安装及使用

安装bloom-filter插件

wget https://github.com/RedisLabsModules/rebloom/archive/v1.1.1.tar.gz

下载完成解压进行 make 编译生成 rebloom.so 文件,在redis配置文件(redis.conf)中加入该模块即可
配置文件中加载模块代码loadmodule /usr/local/redis/redisbloom-1.1.1/rebloom.so
通过配置文件启动redis即可

布隆过滤器的使用

  • 添加bf.add key options
  • 判断是否存在bf.exists key options
  • 添加多个bf.madd key options...
  • 批量判断是否存在bf.mexists
  • 设置过滤器:bf.reserve key 0.01 100

导入依赖

jedis3.0没有rebloom的相关方法,只能通过引入rebloom.jar https://github.com/RedisBloom/JRedisBloom

<dependency>
    <groupId>com.redislabs</groupId>
    <artifactId>jrebloom</artifactId>
    <version>1.0.1</version>
</dependency>

对确定存在元素判断测试

对确定存在的元素进行判断是否存在,无误判

@Test
    public void test1() {
        JedisPool pool = JedisPoolUtils.getPool();
        Client client = new Client(pool);
        pool.getResource().del("book");
        for (int i = 0; i < 10000; i++) {
            String book = "book" + i;
            client.add("book", book);
            boolean ret = client.exists("book", book); 
            if (!ret) {
                System.out.println(i);
            }
        }
        pool.close();
    }

对不存在的元素判断测试

@Test
public void test2() {
    JedisPool pool = JedisPoolUtils.getPool();
    Client client = new Client(pool);
    int count = 0;
    pool.getResource().del("book");
    for (int i = 0; i < 10000; i++) {
        String book = "book" + i;
        boolean ret = client.exists("book", book); 
        if (ret) {
            count++;
            System.out.println(i + "误判数:" + count);
        }
        client.add("book", book);
    }
    pool.close();
}

对已知不存在的元素进行判断,10000个元素,得到结果是误判153个,1.53%

在Redis中有两个值决定布隆过滤器的准确率
error_rate:允许布隆过滤器的错误率,这个值越低过滤器的位数组的大小越大,占用空间越大
initial_size:布隆过滤器可以存储的元素个数,当实际存储的元素个数超出这个值后,过滤器的准确率会下降。
如果觉得百分之1.53的误判率高了,那么可以调整过滤器的参数,默认的Filter的initial_size=100,error_rate=0.1 过滤器设置:client.createFilter("book", 10000, 0.001);
按照以上设置放入元素10000个,那么错误率=0.001 误判数0个

注意事项:
布隆过滤器的initial_size估计的过大,所需要的空间就越大,会浪费空间,估计的过小会影响准确率,因此在使用前一定要估> 算好元素数量,还需要加上一定的冗余空间以避免实际元素高出预估数量造成误差过大。
布隆过滤器的error_rate越小,所需要的空间就会越大,对于不需要过于准确的,error_rate设置的稍大一点也无所谓。

添加新评论

评论列表