Redis布隆过滤器详解

news2024/11/19 8:27:24

目录

    • 一、前言
    • 二、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.01
        bloomFilter.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.coloradmin.cn/o/691759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rewrite 重写跳转

Nginx Rewrite–重写跳转 Nginx Rewrite--重写跳转 一、概述&#xff1a;1.Rewrite 跳转场景&#xff1a;2.Rewrite 跳转实现&#xff1a;3.Rewrite 实际场景&#xff1a;4.Nginx正则表达式&#xff1a;5.Rewrite 命令&#xff1a;6.location分类&#xff1a;7.比较rewrite和l…

【FFmpeg实战】音视频解封装格式

转载自原文地址&#xff1a;https://www.cnblogs.com/zuojie/p/16798273.html 一、什么是封装格式 封装格式也称为容器&#xff0c;用于打包音频、视频以及字幕等等&#xff0c;比如常见的容器有MP4、MOV、WMV、FLV、AVI、MKV等等。容器里面装的是音视频的压缩帧&#xff0c;但…

5、基于Python所写的飞机大战设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87953348?spm1001.2014.3001.5503 《彩图版飞机大战》程序使用说明 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 图1 游戏主界面 具体的操作步骤如下&#xff…

ASEMI代理NXP可控硅BT139-600E参数,BT139-600E规格

编辑-Z BT139-600E参数描述&#xff1a; 型号&#xff1a;BT139-600E 断态重复峰值电压VDRM&#xff1a;600V RMS导通电流IT(RMS)&#xff1a;16A 非重复峰值导通电流ITSM&#xff1a;155A 峰值栅极电流IGM&#xff1a;2A 峰值栅极功率PGM&#xff1a;5W 储存温度Tstg&…

C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)

目录 1、二叉树搜索模型实现及应用场景 1. 二叉搜索树Key模型及其应用 2. 二叉搜索树Key-Value模型及其应用 2、二叉树OJ 2.1 根据二叉树创建字符串 2.2 二叉树的层序遍历I 2.3 二叉树的层序遍历II 2.4 二叉树的最近公共祖先 2.5 二叉搜索树及双向链表 2.6 从前序与中…

想学芯片专业?一文讲清楚芯片报考指南

2021年清北相继成立集成电路学院之后&#xff0c;国内在电子方面有实力积累的高校纷纷跟进&#xff0c;设立集成电路学院、开设集成电路相关专业。 直到今年&#xff0c;高校在集成电路方面的投入和培养力度&#xff0c;仍在持续并越来越大。 就在今年&#xff0c;示范性28所…

CDN是什么?

81. CDN是什么&#xff1f; CDN&#xff08;Content Delivery Network&#xff09; 即内容分发网络&#xff0c;是一种分布式的网络架构&#xff0c;旨在提高用户获取内容的速度、可用性和安全性。CDN通过将内容部署到全球各个节点服务器&#xff0c;并根据用户的地理位置将内…

有关软件检测实验室检测报告的全部知识点盘点

检测报告是实验室检测成果的重要载体&#xff0c;也是软件检测实验室质量管理水平的一个重要体现&#xff0c;本文我们就一起来看一下&#xff0c;软件检测实验室在申请cnas测试认证时&#xff0c;应该如何规范实验室的检测报告。 首先我们一起来看一下&#xff0c;cnas官方对…

记编译 Doris 的过程

目录 概述 1、关于clang 2、链接静态库的问题 3、 cmake的知识 4、关于nm 5、关于 ABI 6、关于debug info 概述 尝试编译 doris&#xff0c;其过程异常坎坷&#xff0c;不过也学到了很多东西。 首先&#xff0c;按照doris官网上的编译指导&#xff0c;下载ldb_toolchai…

python图像处理实战(三)—图像几何变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数&#xff0c;我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…

springDatajpa动态sql根据时间范围将数据导出为excel并使用vue的按钮去触发

用到的技术点&#xff1a; 1.springDatajpa 2.EasyExcel 3.数据库 4.vue 前端实现&#xff1a; 1.创建按钮&#xff08;点击此按钮弹出填写导出条件的弹出框&#xff09; <el-button type"primary" round click"dialogVisible true"><svg-icon …

Java如何实现分库分表

一、为啥要分库分表 在大型互联网系统中&#xff0c;大部分都会选择mysql作为业务数据存储。一般来说&#xff0c;mysql单表行数超过500万行或者单表容量超过2GB&#xff0c;查询效率就会随着数据量的增长而下降。这个时候&#xff0c;就需要对表进行拆分。 那么应该怎么拆分…

vite项目中处理各种静态资源的引入方式介绍

一、引用图片资源 在vite创建的vue3项目中&#xff0c;引用图片资源有以下两种方式&#xff1a; 直接在模板中使用路径引用&#xff1a;在模板中使用标签&#xff0c;通过src属性引用图片。例如&#xff1a; <template><div><img src"./assets/logo.png…

NetApp FAS 存储管理软件,海量非结构化数据存储

NetApp FAS 存储管理软件&#xff0c;海量非结构化数据存储 在 NetApp ONTAP 数据管理软件的支持下&#xff0c;帮助您构建简单、安全且值得信赖的存储基础架构。NetApp FAS 存储阵列可让客户同时兼顾性能和容量。 NetApp FAS 系统经过优化&#xff0c;易于部署和操作&#x…

记录ip段解析成ip

无脑记录者记录使用方法 1.源代码链接 https://github.com/codeexpress/cidr2ip 2.提前准备的内容 go开发语言&#xff0c;链接里面的main.go 3.使用方法 直接新增文件cidrs.txt cidrs.txt文件里面加入需要解析的ip段即可

【实战】 JWT、用户认证与异步请求(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1.login2.middleware of json-server3.jira-dev-tool&#xff08;imooc-jira-tool&#xff09;安装问…

机器学习——自然语言处理(一)

1 分词 1.1 设计原则 切分粒度大&#xff1b;非字典词少、单字字典词少&#xff1b;总体次数少。 1.2 基于词典匹配的分词 1.3 基于语法和规则的分词 目前处在试验阶段 1.4 基于统计的分词 1.5 技术难点 1.5.1 歧义识别 交集型歧义&#xff1a;AB | C or A | BC 组合型…

Jmeter操作数据库运行提示“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver‘”的有效解决

如图所示&#xff0c;在jmeter中运行sql时报错提示“Cannot load JDBC driver class com.mysql.jdbc.Driver” 原因分析&#xff1a;这是因为没有mysql驱动&#xff0c;需要下载对应的jar包 一、下载地址&#xff1a;MySQL :: Download Connector/J 根据需求选择下载&#xf…

数字化转型:智慧物业行业落地与应用的突围之路!

导语 | 红杉中国在《2021 年企业数字化年度指南》中指出&#xff0c;96% 的受访企业已经开展了数字化实践&#xff0c;而其中超过 6 成的受访者都表示期望在未来进一步增加数字化的投入。技术因素或将成为未来两到三年影响企业发展最为重要的外部力量。当前地产与物业行业进入不…