Java+Redis:布隆过滤器,打造高效数据过滤神器!

news2024/11/17 3:48:38

🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚
👉点击这里,就可以查看我的主页啦!👇👇
尘缘的个人主页
🎁如果感觉还不错的话请给我点赞吧!🎁🎁
💖期待你的加入,一起学习,一起进步!💖💖

在这里插入图片描述

目录

    • 1 概述
      • 1.1 原理
      • 1.2 布隆过滤特点
      • 1.3 实现步骤
    • 2 Java示例代码
      • 2.1 引入 pom jar 包
      • 2.2 Java 使用示例
    • 3 单元测试
    • 4 总结

1 概述

布隆过滤器是一种基于概率的数据结构,用于判断一个元素是否存在于一个集合中。相比于传统的数据结构,布隆过滤器具有占用空间少、查询速度快的特点,常被用于缓存、爬虫去重等场景。Redis 作为一款流行的 NoSQL 数据库,也提供了对布隆过滤器的支持。本文将介绍如何使用 Redis 实现布隆过滤器,并提供 Java 示例代码和单元测试。

1.1 原理

布隆过滤器的原理是基于多个哈希函数和一个位数组。当一个元素被加入布隆过滤器中时,利用多个哈希函数计算出多个哈希值,并将对应的位数组位置设为1。当要查询一个元素是否存在时,同样利用多个哈希函数计算出多个哈希值,并查询对应的位数组位置,如果所有位置的值都为1,则认为该元素存在,否则认为该元素不存在。

1.2 布隆过滤特点

布隆过滤器具有以下几个特点:

  1. 占用空间少:布隆过滤器使用位数组来表示集合,相较于其他数据结构,布隆过滤器能够有效地节省空间。虽然随着集合中元素数量的增加,误判率也会增加,但整体空间占用相对较小。
  2. 查询速度快:布隆过滤器通过多次哈希映射将元素映射到位数组中,可以快速地进行查询操作。无论集合中元素数量的增加,查询时间基本保持恒定,不受集合大小的影响。
  3. 支持高并发:由于布隆过滤器只涉及位数组的读写操作,而位数组的读写操作通常是原子性操作,布隆过滤器可以支持高并发的环境。
  4. 不可逆操作:布隆过滤器只能判断元素可能存在或一定不存在,无法从位数组中反推出原始数据。这一特点使得布隆过滤器在某些对保密要求严格的场景有一定优势。
  5. 可能存在误判:由于布隆过滤器使用多个哈希函数进行映射,在进行查找时可能会出现哈希冲突,导致误判。误判率随元素数量的增加而增加,需要在设计时根据业务需求和可接受的误判率进行权衡。

1.3 实现步骤

  1. 安装 Redis 布隆过滤器扩展模块:在 Redis 官方提供的扩展模块 redisbloom 中,我们可以找到 Bloom Filter 的实现。首先需要在 Redis 中下载并安装 redisbloom 模块。
  2. 创建布隆过滤器:利用 redisbloom 提供的指令,我们可以在 Redis 中创建布隆过滤器。需要指定布隆过滤器的名称、期望包含元素的数量以及期望的错误率。
  3. 添加元素:利用 redisbloom 提供的指令,我们可以向布隆过滤器中添加元素。
  4. 查询元素:利用 redisbloom 提供的指令,我们可以查询元素是否存在于布隆过滤器中。

2 Java示例代码

2.1 引入 pom jar 包

引入 jrebloom 最新版本包

<dependency\>
      <groupId\>com.redislabs</groupId\>
      <artifactId\>jrebloom</artifactId\>
      <version\>2.2.2</version\>
    </dependency\>

2.2 Java 使用示例

import io.rebloom.client.Client;

public class BloomFilterExample {
    public static void main(String\[\] args) {
        Client client \= new Client("localhost", 6379);
        
            // 创建布隆过滤器
            client.createFilter("filter", 100000, 0.01);
        
            // 添加元素
            client.add("filter", "element1");
            client.add("filter", "element2");
            
            // 查询元素
            boolean exists \= client.exists("filter", "element1");
            System.out.println("Element1 exists: " + exists);
        }
}

3 单元测试

import io.rebloom.client.Client;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class BloomFilterTest {
    private Client client;

    @BeforeEach
    public void setUp() {
        client = new Client("localhost", 6379);
        client.createFilter("filter", 100000, 0.01);
    }

    @Test
    public void testBloomFilter() {
        client.add("filter", "element1");
        assertTrue(client.exists("filter", "element1"));
        assertFalse(client.exists("filter", "element2"));
    }
}

4 总结

在实际应用中,布隆过滤器可以有效地减少 I/O 操作和网络请求,提升系统性能和效率。通过 Redis 提供的布隆过滤器扩展模块,我们可以方便地在Java中实现布隆过滤器功能。本文介绍了 Redis 实现布隆过滤器的原理和步骤,并提供了 Java 示例代码和单元测试,帮助开发者更好地理解和应用布隆过滤器。

在这里插入图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!
💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

基于蝴蝶优化的BP神经网络(分类应用) - 附代码

基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝴蝶优化BP神经网络3.1 BP神经网络参数设置3.2 蝴蝶算法应用 4.测试结果&#xff1a;5.M…

IIC学习笔记(参考小梅哥教程)

IIC: inter-integrated circuit bus ,即 集成电路总线&#xff0c;串行通信&#xff0c;多主从架构&#xff0c;半双工&#xff08;对讲机&#xff09;&#xff0c;小数据量场合&#xff0c;短距离传输。 速率&#xff1a;100kb/s 、 400kb/s 、 3.4Mkb/s 传输单位&#xff1…

《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组

文章目录 1. 指向多维数组的数组名2. 指向多维数组的指针3. 作为函数参数的多维数组 1. 指向多维数组的数组名 我们知道一维数组名的值是一个指针常量&#xff0c;它的类型是“指向元素类型的指针”&#xff0c;它指向数组的第1个元素。那么多维数组的数组名代表什么呢&#x…

【C++】你看懂C++的类和对象了么

目录 类 默认成员函数 构造函数 析构函数 拷贝构造函数 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 const成员 取地址及const取地址操作符重载 再谈构造函数 构造函数体赋值 初始化列表 explicit关键字 static成员 友元 友元函数 友元类 内…

Springboot+vue的时间管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的时间管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的时间管理系统&#xff0c;采用M&#xff08;model&#xff0…

计算机毕设 大数据工作岗位数据分析与可视化 - python flask

文章目录 0 前言1 课题背景2 实现效果3 项目实现3.1 概括 3.2 Flask实现3.3 HTML页面交互及Jinja2 4 **完整代码**5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要…

使用VSCode插件开发Hyperledger Fabric智能合约(链码)

背景 开发Fabric链码对于开发者而言步骤繁琐&#xff1a;需要部署节点、安装链码、重启网络等操作。当前VSCode中的插件“Hyperledger Fabric Debugger”可以帮助我们迅速开发智能合约。 使用步骤 安装插件 在VSCode中安装Hyperledger Fabric Debugger插件 打开要开发链码的…

【LeetCode热题100】--35.搜索插入位置

35.搜索插入位置 使用二分查找&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int low 0,high nums.length -1;while(low < high){//注意每次循环完都要计算midint mid (low high)/2;if(nums[mid] target){return mid;}if(nums[mid]…

SE、CBAM、ECA 、CA注意力机制

文章目录 1. SE (Squeeze-and-Excitation)2. CBAM (Convolutional Block Attention Module)3. ECA (Efficient Channel Attention)4. CA (Coordinate Attention) 1. SE (Squeeze-and-Excitation) SENet是通道注意力机制的典型实现 对于SENet而言&#xff0c;其重点是获得输入进…

螺杆支撑座有哪些品牌?

螺杆支撑座是机械设备中重要的支撑部件&#xff0c;用于固定和支撑螺杆&#xff0c;以确保机械设备的稳定性和精度。以下是一些生产螺杆支撑座的品牌以及它们的特点&#xff1a; 1、NSK&#xff1a;提供各种高质量的轴承和机械部件&#xff0c;他们的螺杆支撑座采用先进的制造技…

2023.9.26 IO 文件操作详解

目录 文件 文件路径 文件类型 Java 文件操作 文件系统操作 文件内容操作 字节流 InputStream OutputStream 字符流 Reader Writer 补充 close 的必要性 Scanner 的基本了解 文件 当前指硬盘上的文件和文件夹相对于 变量 在内存中&#xff0c;文件 则是在硬盘上 …

竞赛选题 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验

课程2_第2周_测验题 目录&#xff1a;目录 第一题 1.当输入从第8个mini-batch的第7个的例子的时候&#xff0c;你会用哪种符号表示第3层的激活&#xff1f; A. 【  】 a [ 3 ] { 8 } ( 7 ) a^{[3]\{8\}(7)} a[3]{8}(7) B. 【  】 a [ 8 ] { 7 } ( 3 ) a^{[8]\{7\}(3)} a…

【iptables 实战】9 docker网络原理分析

在开始本章阅读之前&#xff0c;需要提前了解以下的知识 阅读本节需要一些docker的基础知识&#xff0c;最好是在linux上安装好docker环境。提前掌握iptables的基础知识&#xff0c;前文参考【iptables 实战】 一、docker网络模型 docker网络模型如下图所示 说明&#xff1…

23.2 Bootstrap框架3

1.卡片 1.1卡片样式 在Bootstrap 5中, .card, card-header, .card-body, .card-footer类是用于创建卡片样式.下面是这些类的简单介绍: * 1. .card: 用于创建一个基本的卡片容器它作为一个包裹元素,通常与其他卡片类一起使用.* 2. .card-header: 用于创建卡片的头部部分.通常在…

双重差分模型(DID)论文写作指南与操作手册

手册链接&#xff1a;双重差分模型&#xff08;DID&#xff09;论文写作指南与操作手册https://www.cctalk.com/m/group/90983583?xh_fshareuid60953990 简介&#xff1a; 当前&#xff0c;对于准应届生们来说&#xff0c;毕设季叠加就业季&#xff0c;写作时间显得十分宝贵…

Sentinel安装

Sentinel 微服务保护的技术有很多&#xff0c;但在目前国内使用较多的还是Sentinel&#xff0c;所以接下来我们学习Sentinel的使用。 1.介绍和安装 Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; 首页 | Se…

Sublime Text 4 for Mac激活下载

Sublime Text for Mac是一款适用于Mac平台的文本编辑器。它具有快速的性能和丰富的功能&#xff0c;可以帮助用户快速进行代码编写和文本编辑。 软件下载&#xff1a;Sublime Text 4 for Mac激活下载 该软件具有直观的界面和强大的功能&#xff0c;包括多行选择、代码折叠、自动…

【数据开发】DW数仓分层设计架构与同步策略(ODS、DWD、DWS等字段含义)

文章目录 1、什么是数据仓库&#xff08;DW&#xff09;2、DW分层设计架构&#xff08;ODS&#xff0c;DWD&#xff0c;DWS&#xff09;3、数仓同步策略 1、什么是数据仓库&#xff08;DW&#xff09; Data warehouse&#xff08;可简写为DW或者DWH&#xff09;数据仓库是什么…

【软考】系统集成项目管理工程师(六)项目整体管理【6分】

一、 前言 1、项目管理三从四得 2、ITO共性总结 1、上一个过程的输出大部分是下-个过程的输入 2、计划和文件是不一样的 (每个输入都有计划和文件) 3、被批准的变更请求约等于计划 4、在执行和监控过程产生新的变更请求(变更请求包括变什么和怎么变&#xff0c;这是变更请求和…