【RuoYi-Vue-Plus】学习笔记 46 - Redisson(十二)布隆过滤器 BloomFilter 简单分析

news2025/1/19 20:42:13

文章目录

    • 前言
    • 参考目录
    • 测试方法
      • 配置说明
      • Demo 方法
    • 功能调用流程分析
      • 1、布隆过滤器的初始化 `tryInit`
      • 1.1、创建布隆过滤器
      • 1.2、初始化布隆过滤器
      • 1.2.1、计算 bit 位数
      • 1.2.2、计算 Hash 函数个数
      • 1.2.3、保存过滤器配置
      • Redis 实际执行结果
      • 2、将待比较元素存入布隆过滤器 `add`
      • Redis 实际执行结果
      • 3、判断布隆过滤器是否存在某元素 `contains`
      • Redis 实际执行结果
    • 拓展思考

前言

在开始这篇文章之前,可以尝试着思考一个问题:有两张关联表A和B,它们是一对多的关系,或者也可以叫作主子表,其中A是主表,B是子表,假如需要更新B表中的数据时,要如何处理?举个具体例子,B表中有id为b1,b2,b3的三条数据与A表id为a1的数据关联,现在需要更新id为b2的数据。

这是一般业务中很常见的操作,和 狮子大佬 讨论了一下这个问题,处理的方式多种多样,例如:

  • 方式一:删除b1,b2,b3,重新插入三条数据。
  • 方式二:对比处理,比较数据是否有更新(包括新增、修改、删除)。
  • 方式三:由前端记录并告知后端更新的内容。
  • ……

在讨论对比处理时,狮子大佬有提出一个概念,就是今天这篇文章的主角 —— 布隆过滤器。虽然之前没用过,但是简单了解之后发现还挺有趣的,所以打算通过这篇文章简单分析一下。

参考目录

  • 大数据处理 - Bitmap & Bloom Filter
    概念以及推导过程文章,就是数学公式看得有点头大。
  • 程序员都必须会的技术,面试必备【布隆过滤器详解】,Redis缓存穿透解决方案
    关于布隆过滤器原理的视频讲解。
  • Redisson 官方文档 - 6.8. 布隆过滤器(Bloom Filter)

布隆过滤器的使用并不难,关键是理解底层是如何进行处理的,布隆过滤器有很多实现方式,并不需要自己去手写,本文采用的是 Redisson 实现的布隆过滤器。

Hutool 也有布隆过滤器,但是只能对字符进行比较,类型太单一,如果是简单的比较也可以尝试使用 Hutool 的,本文将不再展开说明。

测试方法

配置说明

  • 框架版本:V4.4.0
  • Redisson 版本:V3.19.0

注意,如果想要测试 Hutool 的布隆过滤器,需要单独引入相关jar包:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-bloomFilter</artifactId>
</dependency>

Demo 方法

布隆过滤器在框架中并没有使用,所以写了一个简单的测试方法进行验证说明。

com.ruoyi.demo.controller.TestDemoController
在这里插入图片描述

功能调用流程分析

从上面Demo可以看出可以分成三个部分来说明。

如果不熟悉或者是第一次听说布隆过滤器的朋友建议先把参考目录的文章和视频看一看,了解原理之后再看下面的分析。

1、布隆过滤器的初始化 tryInit

1.1、创建布隆过滤器

RedissonClient#getBloomFilter
在这里插入图片描述

Redisson#getBloomFilter
在这里插入图片描述

RedissonBloomFilter#RedissonBloomFilter
在这里插入图片描述

1.2、初始化布隆过滤器

RedissonBloomFilter#tryInit
在这里插入图片描述

1.2.1、计算 bit 位数

RedissonBloomFilter#optimalNumOfBits
在这里插入图片描述

1.2.2、计算 Hash 函数个数

RedissonBloomFilter#optimalNumOfHashFunctions
在这里插入图片描述

1.2.3、保存过滤器配置

在这里插入图片描述

查看 Redis 中保存的配置:
在这里插入图片描述

bit 位数以及 Hash 函数的个数都是由输入的预期元素量和误差率决定的。元素量越大,误差率越小,bit 位数以及 Hash 函数的数量也会越大。

Redis 实际执行结果

1671609384.509600 [0 127.0.0.1:9476] "EVAL" "local size = redis.call('hget', KEYS[1], 'size');local hashIterations = redis.call('hget', KEYS[1], 'hashIterations');assert(size == false and hashIterations == false, 'Bloom filter config has been changed')" "1" "{testFilter}:config" "47" "3"
1671609384.509677 [0 lua] "hget" "{testFilter}:config" "size"
1671609384.509684 [0 lua] "hget" "{testFilter}:config" "hashIterations"
1671609384.509693 [0 127.0.0.1:9476] "HMSET" "{testFilter}:config" "size" "47" "hashIterations" "3" "expectedInsertions" "10" "falseProbability" "0.1"

2、将待比较元素存入布隆过滤器 add

RBloomFilter#add
在这里插入图片描述

RedissonBloomFilter#add
在这里插入图片描述

计算结果:
在这里插入图片描述

查看 Redis 中保存的结果:
在这里插入图片描述

Redis 实际执行结果

1671609384.522289 [0 127.0.0.1:9477] "EVAL" "local size = redis.call('hget', KEYS[1], 'size');local hashIterations = redis.call('hget', KEYS[1], 'hashIterations');assert(size == ARGV[1] and hashIterations == ARGV[2], 'Bloom filter config has been changed')" "1" "{testFilter}:config" "47" "3"
1671609384.522336 [0 lua] "hget" "{testFilter}:config" "size"
1671609384.522344 [0 lua] "hget" "{testFilter}:config" "hashIterations"
1671609384.522352 [0 127.0.0.1:9477] "SETBIT" "testFilter" "29" "1"
1671609384.522361 [0 127.0.0.1:9477] "SETBIT" "testFilter" "8" "1"
1671609384.522366 [0 127.0.0.1:9477] "SETBIT" "testFilter" "37" "1"

3、判断布隆过滤器是否存在某元素 contains

RBloomFilter#contains
在这里插入图片描述

RedissonBloomFilter#contains
在这里插入图片描述

计算结果:
在这里插入图片描述

Redis 实际执行结果

1671609384.523688 [0 127.0.0.1:9469] "EVAL" "local size = redis.call('hget', KEYS[1], 'size');local hashIterations = redis.call('hget', KEYS[1], 'hashIterations');assert(size == ARGV[1] and hashIterations == ARGV[2], 'Bloom filter config has been changed')" "1" "{testFilter}:config" "47" "3"
1671609384.523741 [0 lua] "hget" "{testFilter}:config" "size"
1671609384.523750 [0 lua] "hget" "{testFilter}:config" "hashIterations"
1671609384.523759 [0 127.0.0.1:9469] "GETBIT" "testFilter" "29"
1671609384.523763 [0 127.0.0.1:9469] "GETBIT" "testFilter" "8"
1671609384.523767 [0 127.0.0.1:9469] "GETBIT" "testFilter" "37"

拓展思考

关于布隆过滤器,它是有比较明显的缺点的,其中一个是可能存在误差,所以一般使用场景是对于误差的结果要求没有那么精确的情况下。

布隆过滤器在大数据场景下使用比较多,具体的场景可以自行查找资料,在此就不再展开。

(完)

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

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

相关文章

QT QMenuBra QMenu QAction 菜单栏 操作详解

本文详细的介绍了QMenuBra QMenu QAction 菜单栏的各种操作&#xff0c;例如操作&#xff1a;新建界面、加入菜单项、加入子菜单、新建二级子菜单、QAction分隔符、pMenuBar、点击信号、触发信号、设置图标、设置禁用、设置提示语 等操作 本文作者原创&#xff0c;未经允许禁止…

Eclipse常用设置

Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具 目录 1.解决中文乱码设置propertiew编码 2.更改字体大小 3.设置护眼颜色 4.修…

Usaco Training刷怪旅 第二层第一题:Milking Cows

usaco training 关注我持续更新usaco training内容 Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer begins milking his cow at time 300 (measured in seconds after 5 am) and ends at time 1000. The second farmer …

Go语言入门【09】结构体

结构体 相比于Java&#xff0c;在Go语言中没有类的概念&#xff0c;但是多了结构体。结构体与Java中的类很像&#xff0c;是表示一系列同一类型或不同类型的数据构成的数据集合。 例如可以将学生抽象成一个结构体&#xff0c;每一个学生有以下属性&#xff1a; Name&#xf…

基于pytorch搭建CNN 对人像是否戴口罩进行检测分类 详细教程

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…

A-Level/IB/AP不同课程体系分数可以相互转换吗?

都知道国际学校有不同的课程体系&#xff0c;也会有不同的考试体系。比如A-Level、IB、SAT/ACT和AP&#xff1b;甚至还有国内的高考体系。所以可能有同学家长会问&#xff0c;不同体系之间的分数是否能够进行对比呢&#xff1f; 严格来讲&#xff0c;其实不好对比&#xff0c;但…

wy的leetcode刷题记录_Day59

wy的leetcode刷题记录_Day59 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-12-9 前言 目录wy的leetcode刷题记录_Day59声明前言1780. 判断一个数字是否可以表示成三的幂的和题目介绍思路代码收获63. 题目题目介绍思路代码收获178…

m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 许多室内应用需要有关物体的空间信息。示例应用程序包括项目查找&#xff0c;对象级别映射和在仓库或库中管理的大型对象。然而&#xff0c;使用802.11&#xff0c;可见光或声学的基于位置的服务…

浏览器里console是异步的

console我一直以为是同步执行的&#xff0c;直到在一本书上看到&#xff0c;才了解到console本身有异步的特性。虽然在平常开发中经常使用console&#xff0c;但是真的没有意识到它的异步性。 下面就看下异步的实例 基础类型 该类型是我们开发中经常使用的&#xff0c;正是这…

01VSCode配置Anaconda 环境和调试环境

VSCode配置Anaconda 环境 Anaconda 简介 自带Python解释器Anaconda 附带了一大批常用数据科学包150 多个科学包及其依赖项Anaconda 是在 conda&#xff08;一个包管理器和环境管理器&#xff09;上发展出来的&#xff0c;包含了虚拟环境管理工具通过虚拟环境可以使不同的Pyth…

【Python深度学习】RNN循环神经网络结构讲解及序列回归问题实战(图文解释 附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 循环神经网络 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是用于对序列的非线性特征进行学习的深度神经网络。循环神经网络的输入是有前后关联关系的序列。 循环神经网络可以用来解决与序列…

python数据预处理时缺失值的不同处理方式!

在使用python做数据分析的时候&#xff0c;经常需要先对数据做统一化的处理&#xff0c;缺失值的处理是经常会使用到的。 一般情况下&#xff0c;缺失值的处理要么是删除缺失数据所在的行&#xff0c;要么就是对缺失的单元格数据进行填充。 今天介绍的是使用差补法/均值/固定…

CSS -- 08. 移动WEB开发之流式布局

文章目录移动WEB开发之流式布局1 移动端基础1.1 浏览器现状1.2 手机屏幕现状1.3 移动端调试方法2 视口2.1 布局视口 layout viewport2.2 视觉视口 visual viewport2.3 理想视口 ideal viewport2.4 meta视口标签3 二倍图3.1 物理像素&物理像素比3.2 多倍图3.3 背景缩放 back…

clickhouse-部署指南(亲测超详细)

文章目录环境要求测试环境Tar方式安装clickhouse用户授权访问控制服务配置启动连接测试TABIX webUI性能测试环境要求 ClickHouse可以在任何具有x86_64&#xff0c;AArch64或PowerPC64LE CPU架构的Linux&#xff0c;FreeBSD或Mac OS X上运行 官方预构建的二进制文件通常针对x86…

prometheus+grafana对数据库mysql监控

安装 mysql docker run --name mysql-test -p MYSQL ROOT_PASSWORD123456 -p23306:3306 mysql:5.7.26启动镜像的时候 已经是把docker容器内部的3306端口 映射到本机了 直接通过navicat连上 进入mysql容器内部 docker exec -it 容器id /bin/bash, 启动 mysql. docker start d…

33.flink cdc 实时数据同步利器

什么是flink cdc? 对很多初入门的人来说是无法理解cdc到底是什么个东西。 有这样一个需求&#xff0c;比如在mysql数据库中存在很多数据&#xff0c;但是公司要把mysql中的数据同步到数据仓库(starrocks), 数据仓库你可以理解为存储了各种各样来自不同数据库中表。 数据的同步…

2-2-3-7、FutureCompletableFuture详解

Runnable 线程的任务接口&#xff0c;用于定义被执行任务方法的抽象&#xff0c;是函数式接口&#xff08;仅存在一个需要实现方法的接口&#xff09;&#xff0c;其方法为run方法通过对并发编程中java线程的了解&#xff0c;Thread调用start方法&#xff0c;最后操作系统会通过…

Confluence 调整会话超时(session timeout)

文章目录前言一、概括二、实际场景应用1.更改空闲超时2.更改记住我 cookie 的生命周期3.在用户通过身份验证后的某个时间强制注销用户总结前言 在 Confluence 中有两个会话 Cookie&#xff1a; JSESSIONID: 由 Tomcat 使用和管理。 默认情况下&#xff0c;这被视为会话 cooki…

类与对象(中)

类与对象类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特性赋值运算符重载运算符重载赋值运算符重载前置 后置 重载const成员函数取地址及const取地址操作符重载类的6个默认成员函数 当类中没有任何成员时&#xff0c;称作空类 但是呢&#xff0c;编译…

Docker使用(容器、镜像相关命令)

虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实体结构间的不可切割…