RedisBloom 安装与使用

news/发布时间2024/5/23 20:07:15

 

目录

    • 一、前言
    • 二、RedisBloom 安装与使用
    • 三、RedisBloom 常用命令汇总
    • 四、通过 Jedis 使用 RedisBloom
    • 五、Redisson 封装的布隆过滤器
    • 六、使用哪种方式的过滤器比较好?

 

一、前言

布隆过滤器(Bloom Filter)是 Redis 4.0 版本提供的新功能,它被作为插件加载到 Redis 服务器中,给 Redis 提供强大的去重功能。

相比于 Set 集合的去重功能而言,布隆过滤器在空间上能节省 90% 以上,但是它的不足之处是去重率大约在 99% 左右,也就是说有 1% 左右的误判率,这种误差是由布隆过滤器的自身结构决定的。俗话说“鱼与熊掌不可兼得”,如果想要节省空间,就需要牺牲 1% 的误判率,而且这种误判率,在处理海量数据时,几乎可以忽略。

二、RedisBloom 安装与使用

(1)第一步:安装Redis

关于Linux当中redis的安装:https://blog.csdn.net/weixin_43888891/article/details/125830622

(2)第二步:安装RedisBloom

在 Redis 4.0 版本之后,布隆过滤器才作为插件被正式使用。布隆过滤器需要单独安装,可以去GitHub,找到对应的版本下载,链接:https://github.com/RedisBloom/RedisBloom/releases,下载后再通过xftp上传到Linux系统里,当然也可以直接通过wget来下载。

这里注意我下载的2.2.18版本,最新版本2.6我没有用,原因是make编译的时候会报异常。

# 下载
wget https://codeload.github.com/RedisBloom/RedisBloom/tar.gz/refs/tags/v2.2.18
# 解压
tar -zxvf v2.2.18

 

在这里插入图片描述

# 进入到解压目录
cd RedisBloom-2.2.18/
# 编译
make
 

编译成功,可以看到redisbloom.so文件

在这里插入图片描述

(3)第三步:Redis集成RedisBloom插件

在redis.conf配置文件中加入如RedisBloom的redisbloom.so文件的地址

# vim查看redis.conf
vim /opt/redis-stable/redis.conf
# 在文件后面加上如下配置
loadmodule /opt/RedisBloom-2.2.18/redisbloom.so
 

(4)第四步: 重启Redis进行测试

# 关闭redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
# 启动redis
/opt/redis-stable/src/redis-server redis.conf
# 连接客户端
/opt/redis-stable/src/redis-cli -c -h 127.0.0.1 -p 6379 -a 123456
 

在这里插入图片描述

三、RedisBloom 常用命令汇总

在这里插入图片描述

127.0.0.1:6379> bf.add spider:url www.baidu.net
(integer) 1
127.0.0.1:6379> bf.exists spider:url www.baidu.net
(integer) 1
127.0.0.1:6379> bf.madd spider:url www.taobao.com www.123qq.com
1) (integer) 1
2) (integer) 1
127.0.0.1:6379> bf.mexists spider:url www.jd.com www.taobao.com
1) (integer) 0
2) (integer) 1
 

注意使用AnotherRedisDesktopManager客户端是没办法查看该数据类型的值的。

在这里插入图片描述

四、通过 Jedis 使用 RedisBloom

Java 客户端 Jedis没有提供指令扩展机制,所以你无法直接使用 Jedis 来访问Redis Module 提供的 bf.xxx 指令。RedisLabs 提供了一个单独的包 JReBloom,但是它是基于 Jedis的。

我们使用的话只需要引入JReBloom就可以,JReBloom内部引用了Jedis 。假如系统引用了jedis,又要引用jrebloom,这时候需要注意版本冲突的问题。

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.9.0</version>
</dependency><dependency><groupId>com.redislabs</groupId><artifactId>jrebloom</artifactId><version>2.2.2</version>
</dependency>
 

代码示例:

import io.rebloom.client.Client;
import redis.clients.jedis.Jedis;public class JrebloomDemo {public static void main(String[] args) {//连接本地的 Redis 服务Jedis jedis = new Jedis("192.168.115.239", 6379);//jedis.auth("123456");//创建client也支持连接池的:public Client(Pool<Jedis> pool)Client client = new Client(jedis);// 测试数据int capacity = 10000;// 容错率,只能设置0 < error rate range < 1  不然直接会异常!double errorRate = 0.01;// 测试的key值String key = "ceshi";// 创建过滤器:可以创建指定位数和容错率的布隆过滤器,如果过滤器已经存在创建的话就会异常if (!jedis.exists(key)) {client.createFilter(key, capacity, errorRate);}for (int i = 0; i < capacity; i++) {client.bfInsert(key, String.valueOf(i));}System.out.println("存入元素为=={" + capacity + "}");// 统计误判次数int count = 0;// 我在数据范围之外的数据,测试相同量的数据,判断错误率是不是符合我们当时设定的错误率for (int i = capacity; i < capacity * 2; i++) {if (client.exists(key, String.valueOf(i))) {count++;}}System.out.println("误判元素为=={" + count + "}");// 删除过滤器client.delete(key);}
}
 

运行示例:

在这里插入图片描述

现在存在个问题,假如我们redis并没有安装RedisBloom,那他可以运行吗?

答案是不可以的,他根本无法识别bf.xxx 指令

在这里插入图片描述

错误率越低,所需要的空间也会越大,因此就需要我们尽可能精确的估算元素数量,避免空间的浪费。我们也要根据具体的业务来确定错误率的许可范围,对于不需要太精确的业务场景,错误率稍微设置大一点也可以。

查看刚刚创建的过滤器:这个数据结构不支持get查询。

在这里插入图片描述

五、Redisson 封装的布隆过滤器

Redisson布隆过滤器官网介绍

引入依赖:

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

代码示例:

import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonBloomFilter {public static void main(String[] args) {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379")//.setPassword("123456").setDatabase(0);//获取客户端RedissonClient redissonClient = Redisson.create(config);// 测试数据int capacity = 10000;// 容错率,只能设置0 < error rate range < 1  不然直接会异常!double errorRate = 0.01;// 测试的key值String key = "ceshi";RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter(key);// 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01bloomFilter.tryInit(capacity, errorRate);for (long i = 0; i < capacity; i++) {bloomFilter.add(String.valueOf(i));}System.out.println("存入元素为=={" + capacity + "}");// 统计误判次数int count = 0;// 我在数据范围之外的数据,测试相同量的数据,判断错误率是不是符合我们当时设定的错误率for (int i = capacity; i < capacity * 2; i++) {if (bloomFilter.contains(String.valueOf(i))) {count++;}}System.out.println("误判元素为=={" + count + "}");// 删除过滤器// bloomFilter.delete();}
}
 

运行结果:

通过运行结果不难发现,同样是10000数据,和0.01容错,Redisson 实现的布隆过滤器明显没有基于RedisBloom的过滤器容错率好。

在这里插入图片描述

查看刚刚创建的过滤器:

在这里插入图片描述

六、使用哪种方式的过滤器比较好?

RedisBloom和Redisson实现的过滤器区别:

  • 数据结构: RedisBloom相当于为了实现过滤器而新增了一个数据结构,而Redisson是基于redis原有的bitmap位图数据结构来通过硬编码实现的过滤器。
  • 存储: 存储两者其实并没有差距,都没有存储原数据,我使用Redisson存储了10000条数据然后设置的0.01容错占用了11.7kb也符合布隆过滤器的占用。
    在这里插入图片描述
  • 容错: 同样是10000条数据0.01容错,RedisBloom误判元素是58,Redisson实现的是227。
  • 耦合度: 使用RedisBloom就需要安装RedisBloom,如果不安装RedisBloom程序直接就不能使用了,而使用Redisson他只依赖于redis。
  • 分片: RedisBloom只是redis一种数据结构,本身redis集群就是支持分片的,所以RedisBloom肯定也没问题,Redisson的布隆过滤器也支持分片,但是需要付费。
  • 性能: 使用 redis 的位图来实现的布隆过滤器性能上要差不少。比如一次 exists 查询会涉及到多次 getbit 操作,网络开销相比而言会高出不少。

综上比较,个人建议使用RedisBloom比较好一点!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.jwkm.cn/p/74036205.html

如若内容造成侵权/违法违规/事实不符,请联系宁远站长网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

[考研] 数据结构

24考研期间关于数据结构相关的总结。(本地的markdown图片没问题,上传的图片排版有点小问题,懒得调了。) 基础 线性结构:线性表、栈、队列 非线性结构:图、树、集合 区分线性结构和非线性结构:线性结构的每个元素(除了第一个和最后一个元素)最多只有一个直接前驱和一个直…

[数字人] NeRF实现

[数字人] NeRF实现 体渲染 光沿着路径传播,如果路径上有物体,就会损失能量,我们将单位面积的光的能量记为\(I(t)\)。假设光走了\(\Delta t\)的路程,此时剩下的能量可以表示成: \[I(t+\Delta t) = I(t) * (1-\sigma(t)\Delta t) \]其中\(\sigma(t)\)是该点物体的“密度”,…

Explain的列介绍

explain中的每个列的信息: SET SESSION optimizer_switch=derived_merge=off; #关闭mysql5.7新特性对衍生表的合并优化 EXPLAIN SELECT (SELECT 1 FROM actor WHERE id = 1) FROM (SELECT * FROM film WHERE id = 1) der;id列 id列的编号是select的序列号,有几个select就有几…

每日总结2024/1/15(爬虫学习)

原文链接 python爬虫 - Python3.x+Fiddler抓取APP数据 - 学习分享 - SegmentFault 思否 我爬取的为浏览器数据 可以看到在这里我们成功爬取到了浏览器数据,但是在实现python中爬取数据遇到了很多版本以及配置缺少的问题,同时我的版本中http为2,不知道有没有其他影响,代码目…

前缀和差分

前缀和&差分(蒟蒻篇) 前缀和前缀和是指某序列的前n项和,而差分可以看成前缀和的逆运算。 一般用于大量的求一段连续区间的和 时间复杂度:预处理O(n),查询O(1)一维前缀和 模板 作用是:找a序列的一段连续区间的和 for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];a序列l~…

记一次金蝶云星空协同平台签出元数据没反应

使用同步业务对象到数据中心还是没反应。 后来实在没辙了,就更新数据中心业务对象到应用,然后再签出发现可行。 不知道问题在哪里,幸好环境一致,问题不大就没去研究了。