速了解及使用布隆过滤器

布隆过滤器

介绍

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

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

实现原理

  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方法判断是否存在

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自媒体从0-1起号全流程落地指南。(含工具)

下面开始进入主题&#xff1a; 一、持续涨粉的技巧 持续账号的账号通常是具备以下的几种特征 ①利他性&#xff1a;利他性的核心在于你向用户提供了什么&#xff1f; 可以透过逆向思维来体现&#xff0c;首先要明确目标人群及其需求&#xff0c;然后根据这些需求提供必要的…

JetsonNano —— 3、在Nano板卡编译可硬件加速FFmpeg,测试FFmpeg调用nvmpi编解码器加速

最终FFmpeg运行加速效果如下: FFmpeg 简介 一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。   JetsonNano 简介 NVIDIA Jetson Nano为数百万台高性能、低功耗设备提供前所未有的功能。这项技术创新为网络录像机、机器人或具有高级分析功能的智能家居网关等…

java 解决跨域时遇到问题,怎么来做一个跨域环境

今天遇到一个问题&#xff1a; 关于#java#的问题&#xff1a;java 解决跨域时遇到问题&#xff1a;为什么跨域访问时配置的CorsFilter没有进入&#xff1f;直接访问请求地址时进入了配置的CorsFilter 由于没有实际的跨域环境&#xff0c;因此打算在本机建一个跨域环境&#xff…

vue3使用依赖注入实现跨组件传值

父组件Index.vue: <script setup> import { onMounted, provide, ref } from vue import Child from ./Child.vue import ./index.cssconst count ref(0)provide(count, count)const handleClick () > {count.value }onMounted(() > {}) </script><tem…

NSSCTF | [第五空间 2021]WebFTP

注意看这里的题目标签&#xff0c;目录扫描&#xff0c;.git泄露。那么这道题虽然打开是一个登录的界面&#xff0c;但是并不是我们熟悉的爆破和SQL注入。 但是可以在题目标签上看到目录扫描&#xff0c;我们就用dirsearch扫一扫看看 python dirsearch.py -u http://node4.ann…

51单片机实现俄罗斯方块游戏编程

一、设计要求 &#xff08;1&#xff09;利用51单片机&#xff0c;设计一款俄罗斯方块游戏&#xff0c;完成硬件电路的开发和程序的编写调试&#xff1b; &#xff08;2&#xff09;采用LCD12864液晶作为游戏运行界面&#xff1b; &#xff08;3&#xff09;利用按键输入灵活…

[OpenGL] PCF 柔和阴影

目录 一 为什么要使用PCF技术? 二 算法 三 效果 本章节源码点击此处 一 为什么要使用PCF技术? 在阴影改善这篇文章最后我们发现阴影的边缘锯齿化很严重,对于这种问题主要是因为采样精度的问题对于不同片段有可能从深度纹理中采样到了同一个纹理像素,这就导致形成了明显的…

采用java+B/S开发的全套医院绩效考核系统源码springboot+mybaits 医院绩效考核系统优势

采用java开发的全套医院绩效考核系统源码springbootmybaits 医院绩效考核系统优势 医院绩效管理系统解决方案紧扣新医改形势下医院绩效管理的要求&#xff0c;以“工作量为基础的考核方案”为核心思想&#xff0c;结合患者满意度、服务质量、技术难度、工作效率、医德医风等管…

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1 漏洞概述 CVE-2018-2628 是 Oracle WebLogic Server&#xff08;WLS&#xff09;核心组件中的一个反序列化命令执行漏洞。此漏洞允许未授权的用户通过 T3 协议在远程服务器上执行任意命令&#xff0c;从而可能完全控制受影响的服务器。 2 影响版本 该漏洞影响了以下版本的…

宁夏银川最牛起名大师的老师颜廷利:宝与饱,饿跟恶

对于中国优秀传统文化之根-汉语而言&#xff0c; 恶&#xff0c;对应着‘饿’&#xff1b; 宝&#xff0c;对应着‘饱’… 由此可见&#xff0c;无论是‘饿’&#xff08;与‘恶’同音&#xff09;&#xff0c;还是‘饱’&#xff08;与‘宝’通音&#xff09;&#xff0c;实际…

粒子群算法(Particle Swarm Optimization)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 粒子群优化算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;的灵感来源于鸟群或鱼群的觅食行为。想象一下&a…

python怎么遍历字符串

python怎么遍历字符串&#xff1f;下面给大家介绍四种方法&#xff1a; 1、第一种方式&#xff0c;使用for in遍历字符串。 girl_str "love You" for everyChar in girl_str:print everyChar 2、第二种方式&#xff0c;使用range()或xrange()&#xff0c;把字符串…

iOS MRC那句话

混编时使用MRC文件需要使用这句话 -fno-objc-arc在下图中显示的位置添加

vue:网页icon无法显示

logo文件放在public文件夹下&#xff0c;在html里设置icon。 本地源码运行后发现网页icon无法显示我们设置的logo&#xff0c;而是显示了浏览器默认icon。 这个问题不需要解决&#xff0c;部署后网页icon显示就正常了。

【软考网络工程师】每日练题学知识

1.在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是&am…

【MySQL的内外连接】

文章目录 一、内连接二、外连接1.左外连接2.右外连接 一、内连接 基本语法&#xff1a; select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b;&#xff08;这里的and&#xff0c;也可以修改成where&#xff0c;并且建议使用where&#xff0c;逻辑更清晰…

GEE案例分析——利用多时 Sentinel-1/2 和 Landsat-8/9 遥感数据在GEE中使用机器学习方法进行作物类时序分类

摘要 准确绘制作物类型图对于确保粮食安全至关重要。遥感(RS)卫星数据空间覆盖面广,时间频率高,是这一领域前景广阔的工具。然而,由于作物的类内和类间变异性很高,利用 RS 数据进行准确的作物类型分类方法的需求仍在不断增长。为此,本研究提出了一种新颖的并行级联集合…

《Video Mamba Suite》论文笔记(3)Mamba作为时序适配器的作用

原文翻译 4.3 Mamba as Video Temporal Adapter&#xff08;时序自适应建模&#xff09; Tasks and datasets.除了评估 Mamba 在后时间建模中的性能外&#xff0c;我们还评估了它作为视频时间适配器的有效性。通过对自我中心数据[29,49]进行视频-文本对比学习&#xff0c;对双…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

翻天娃时光列车于地铁1号线闪耀启程,五一站厅活动再掀品牌热潮

四月下旬&#xff0c;备受瞩目的翻天娃食品品牌地铁广告震撼亮相长沙地铁1号线&#xff0c;翻天娃时光列车闪耀启程。五月中旬&#xff0c;翻天娃又在五一广场地铁站举办了一场别出心裁的站厅活动&#xff0c;将市民乘客们带入了一场穿越时光的奇妙旅程。 作为一家专注于休闲食…