速了解及使用布隆过滤器

news2024/9/20 0:53:39

布隆过滤器

介绍

概念:是一种高效查询的数据结构

作用:判断某个元素是否在一个集合中。(但是会出现误判的情况)

实现原理

  1. 加入元素

  • 当一个元素需要加入到布隆过滤器中时,会使用一组哈希函数对该元素进行计算,得到多个哈希值。

  • 每个哈希值对应到位数组的一个特定位置,将这些位置的值设置为1。

  1. 查询元素

  • 对给定的元素再次进行相同的哈希计算,得到一组哈希值。

  • 检查位数组中对应的每个位置是否都为1。如果所有位置都是1,那么认为这个元素可能在布隆过滤器中;如果有任何一个位置不为1,那么可以确定该元素不在布隆过滤器中。

误判和不可删除

下面是一个插入元素的图:

image-20240511213606519

模拟插入:

  1. 先插入“你好”

    1. 计算“你好”的hash值

    2. 插入到2的位置

  2. 插入“hello”

    1. 计算“hello”的hash值

    2. 插入到2的位置

  • 误判:如果计算出“hello”和“你好”的hash值是一样的,这个时候就会出现误判的情况。

  • 不能删除:当发现“你好”和“hello”的值都在2位置,如果要删除“你好”的hash值在布隆过滤器中,那么“hello”也会同时被删除。

使用场景

使用在缓存穿透场景。

可以利用布隆过滤器先看看数据是否存在,再进行下一步的判断,可能可以减少很多次的数据库访问请求。

if(!bloomFilter.contains(data)){
    //.....
}

一般采用上述这种方式进行布隆过滤器的判断。

原因:布隆过滤器可能存在误判

  • 当布隆过滤器中不存在一个数据的时候,那么这个数据肯定不存在。

  • 当布隆过滤器存在一个数据的时候,可能这个数据还是存在的。

补充缓存穿透:

前端请求要查询一个数据,但是Redis中没有这个数据,所以要将请求打到数据库中。如果是大量请求情况,这个大的流量,可能导致数据库直接挂了。(一般可以采用布隆过滤器+分布式锁防止缓存穿透)

布隆过滤器使用

  • Guava的布隆过滤器

  • Redis实现的布隆过滤器

这里以Redis的布隆过滤器作示例:

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
​
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

2、配置Redis参数

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
#      password: 123456     #密码

3、布隆过滤器的配置类:

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
/**
 * 布隆过滤器配置
 */
@Configuration
public class RBloomFilterConfiguration {
​
​
    @Bean
    public RBloomFilter<String> userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("xxx");
        cachePenetrationBloomFilter.tryInit(0, 0);
        return cachePenetrationBloomFilter;
    }
}

tryInit 有两个核心参数:

  • expectedInsertions:预估布隆过滤器存储的元素长度。

  • falseProbability:运行的误判率

这里是一个计算误判率和大小的网站:Bloom Filter Calculator

4、代码中的使用

private final RBloomFilter<String> userRegisterCachePenetrationBloomFilter;
  • add方法添加

  • contains方法判断是否存在

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

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

相关文章

每周日发系统规划与管理师伴读脑图,今天是第4章

从第4章开始&#xff0c;系统规划与管理师的学习就正式步入了主题&#xff0c;考虑到我过去中断了2周&#xff0c;想必你的第4章教程已经看完了吧&#xff1f;

2024年天津市静海区教师招聘报名流程(建议电脑)

2024年天津市静海区教师招聘报名流程&#xff08;建议电脑&#xff09; #报名 #教师招聘 #教师招聘考试 #教招 #天津教师招聘 #天津教师招聘考试 #24年天津教师招聘 #24年天津市教师招聘考试 #天津市静海区教师招聘 #静海区教师招聘考试 #静海区教师编 #静海区#

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率&#xff08;线程处理请求的时间占比&#xff09;。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下&#xff0c;查看…

Ubuntu意外断电vmdk损坏--打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。

背景&#xff1a;电脑资源管理器崩溃卡死&#xff0c;强行断电重启&#xff0c;结果虚拟机打不开了&#xff0c;提示打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。 删除lck文件&#xff1a;失败vmware-vdiskmanager修复 &#xff1a;提示无法修复最终用 VMFS Recovery挂载…

【机器学习】集成学习在信用评分领域实例

集成学习在信用评分领域的应用与实践 一、引言二、集成学习的概念与原理三、集成学习在信用评分中的应用实例四、总结与展望 一、引言 在当今金融数字化快速发展的时代&#xff0c;信用评分成为银行、金融机构等评估个人或企业信用风险的重要工具。然而&#xff0c;单一的信用评…

OFDM802.11a的FPGA实现(十二)使用FFT IP核添加循环前缀

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言2.循环前缀3.硬件实现4.ModelSim仿真 1.前言 为了能够消除传输过程当中的符号间干扰&#xff0c;在IFFT处理完毕之后还要加上循环前缀。 2.循环前缀 实际通信信道中,由于接…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

动态规划算法:⼦数组、⼦串系列(数组中连续的⼀段)

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; i. 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b; ii. 以某个位置…

清除HP打印机内存的5种方法,总有一种适合你

序言 HP打印机通常具有2 MB到32 MB的内部内存容量。打印机使用此内存存储打印作业和信息,如文档中的页数、纸张类型、纸张大小和字体。但是,如果打印作业的大小超过打印机的内存大小,它将无法执行打印命令,并将拒绝打印文档。 此外,有时打印作业可能会卡在打印机的内存中…

Matlab/simulink永磁直驱风机的建模仿真

Matlab/simulink直驱永磁同步风机的建模仿真&#xff0c;跟随风速波动效果好&#xff0c;可以作为后期科研的基础模型

关于 IIS 开启匿名访问网站仍要账号密码登录网站的解决方法

欢迎关注公总号【云边小网安】 问题提出&#xff1a;发现虽然勾选了允许匿名访问网站&#xff0c;但在访问某一网站的时候仍然需要登录账号密码 解决方法一&#xff1a;登录管理员账号密码解决方法二&#xff1a;添加访问网站文件夹的用户 访问某一网站本质上来讲&#xff0…

Adobe Animate 2024软件下载

Adobe Animate 2024软件下载&#xff1a; 百度网盘下载https://pan.baidu.com/s/1cQQCFL16OUY1G6uQWgDbSg?pwdSIMS Adobe Animate 2024&#xff0c;作为Flash技术的进化顶点&#xff0c;是Adobe匠心打造的动画与交互内容创作的旗舰软件。这款工具赋予设计师与开发者前所未有的…

避坑指南!RK3588香橙派yolov5生成RKNN模型!

地址1&#xff0c;转换模型 地址2&#xff0c;转换模型 地址3&#xff0c;解决ppa 下载k2 本文目录 一、将.pt模型转为onnx模型文件。&#xff08;Windows&#xff09;二、将.onnx模型转为.rknn模型文件。&#xff08;Linux&#xff09;三、将.rknn模型部署到开发板RK3588中…

SSRF服务器端请求伪造

漏洞原理 SSRF挖掘 SSRF具体利用 SSRF具体验证 SSRF防御与绕过 漏洞原理 这个漏洞允许攻击者去利用服务端的功能&#xff0c;来请求其他网络资源 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是指攻击者能够从易受攻击的 Web应用程序发送精心设计的请求的对其他网站…

数列排序C++

题目&#xff1a; 思路&#xff1a; 创建一个数组a&#xff0c;循环遍历输入&#xff0c;然后使用函数sort进行上升排序&#xff0c;最后循环遍历输出a[i]. #include <bits/stdc.h> using namespace std; int main(){int a[201];int n;cin>>n;//输入for(int i0;i&l…

使用单片机在图形点阵LCD上绘制波形图

使用单片机在图形点阵LCD上绘制波形图 需求&#xff1a; 假如有一组浮点数据&#xff0c;是通过AD转换得到的&#xff0c;保存在数组MyArray[]中&#xff0c;采集点数为len&#xff0c;采集周期为T&#xff0c;现在想用单片机在LCD上绘制出这组数据对应的波形图&#xff0c;该…

python实现动态时钟功能

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 一.前言 时钟,也被称为钟表,是一种用于测量、记录时间的仪器。时钟通常由时针、分针、秒针等计时仪器组成,是现代社会不可或缺的一种计时工具。它的发明和使用极大地改变了人类的生活方式和时间观念。 时钟的类型有很多,…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而&#xff0c;面对大量的文本内容&#xff0c;传统的逐行编辑方式往往显得繁琐且效率低下。那么&#xff0c;有没有一种更高效、更便捷的解决方案呢&#xff1f;答案是肯定的——批量文本高效编辑神器&#xff0c;让您的文本处理…

torch_geometric安装(CPU版本)

①打开官方安装网址&#xff1a;https://pytorch-geometric.readthedocs.io/en/2.3.0/install/installation.html ②对根据Pytorch选择相应版本。此前一直用CUDA不成功&#xff0c;这次使用CPU版本&#xff08;因为不用对应cuda&#xff0c;pytorchcudageometric三者对应起来很…

深入理解Java并发:Future与CompletableFuture详解

知识背景&#xff1a; 在工作过程中有用到CompletableFuture&#xff0c;之前接触不多&#xff0c;特此下来学习一下&#xff0c;与大家一起分享&#xff01; 总体介绍&#xff1a; 在多线程编程中&#xff0c;异步计算是一种常见的需求。其中Future和CompletableFuture是处…