布隆过滤器初探

1、什么是布隆过滤器

布隆过滤器是一个很长的二进制向量和一系列随机hash函数。布隆过滤器可以用于检索一个元素是否在一个集合中。
常见的hash函数的应用hashMap、hashSet等
回顾一下hashMap的结构
在这里插入图片描述在这里插入图片描述

hashMap由数组+链表+红黑树(java1.8后,链表元素长度大于8,且数组长度大于64时,链表转为红黑树,优化查询于插入的效率),散列值通过hash函数确定key(桶数组的下标),key冲突(散列冲突)时,存入后续的链表中。
在数据量较小的情况下hash散列表是能够支撑我们的业务场景的,无hash冲突情况下时间复杂度为log(1),hash冲突时为log(n)。当存储数据达到百万、千万时,散列所需的存储空间越来越大,检索速度也越来越慢,而布隆过滤器在查询于插入的时间与空间复杂度都为log(k)。

2、布隆过滤器原理

2.1 bitmap

布隆过滤器的数据存储是基于bitmap的。bitmap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。
在bitmap的位数组中每一位表示一个数,0表示不存在,1表示存在,如下表示{1,2,4,6}这个数组。

假设需要存储2亿个int整数
在Java中,int占4字节,1字节=8位(1 byte = 8 bit)
每个数字用int存储,那就是2亿个int,占用的空间约为 (200000000*4/1024/1024/1024)≈735M
按位存储,2亿个数就是2亿位,占用空间约为 (200000000/8/1024/1024/1024)≈23.8M

2.2 布隆过滤器的原理

bitmap只能存储整数,其他数据类型就捉襟见肘了。布隆过滤器把一个元素,通过 K 个 Hash 函数将这个元素映射成bitmap中的 K 个点,把它们置为1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:
如果这些点有任何一个 0,则被检索元素一定不在;
如果都是 1,则被检索元素很可能在。
以hello的存储为例,把1,3,5置为1,查询时hash值为1,3,5为1,则认定hello存在
在这里插入图片描述

2.3 缺点

误判率
假设保存两个值,hello和wordhello对应的index为1,3,5word对应的index为2,4,6
而此时来了一个值java,对应的index为1,4,5查询得出结果:exist(java) = true但其实,java这个数据并不存在,这就会产生一定的误判。
删除
如果hash(hello)=1,3,5这时候hash(java)=1,4,6如果删除了hello的值,index = 1,3,5置为0,同时意味着java在判定是否存在时为false

3、布隆过滤器的实现

布隆过滤器使用时需要确定两个变量,容量(位数组的大小,容量越大,hash冲突可能性越小)与误判率(误判率越小hash运算次数越多,效率越低)。要根据实际业务场景预判容量,再设定误判率。
误判率与容量关系推导:https://juejin.cn/post/6888209593378291720

3.1guava布隆过滤器

Google提供的guava包里面也提供了布隆过滤器,
引入pom坐标

<dependency>
	<groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

运用Demo

 @Test
 public void bloomFilterTest() {
   BloomFilter<String> b = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 10000, 0.001);
   b.put("121");
   b.put("122");
   b.put("123");
   Assert.assertEquals(false, b.mightContain("12321"));
 }

3.2 Redis布隆过滤器

redis里的setbit指令,对于布隆过滤器的实现十分便利:

setbit key offset value

key是键,offset是偏移量,value就是1或者0。比如下面的就是将key1 的第5位置为1。
在这里插入图片描述

引入redission插件

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
</dependency>

使用demo

@Test
public void redissionBoolFilter() {
  Config config = new Config();
  config.useSingleServer().setAddress("redis://127.0.0.1:6379");
  RedissonClient redisson = Redisson.create(config);

  RBloomFilter<String> bloomFilter = redisson.getBloomFilter("user");
  // 初始化布隆过滤器,预计统计元素数量为10000,期望误差率为0.01
  bloomFilter.tryInit(10000L, 0.01);
  bloomFilter.add("Tom");
  bloomFilter.add("Jack");
  Assert.assertEquals(true, bloomFilter.contains("Tom"));  //true
  Assert.assertEquals(false, bloomFilter.contains("Linda"));  
}

4、布隆过滤器在特征计算平台的应用

特征计算平台在统计ip维度、设备标识维度的数据时,数据量是巨大的,在统计以天为统计维度时,使用布隆过滤器不仅减少服务器压力,也提升服务性能。

4.1 guava布隆过滤器与redis过滤器的对比

guava过滤器

优点
1、基于内存,性能高

缺点
1、基于JVM内存的一种布隆过滤器,重启即失效
2、本地内存无法用在分布式场景
3、不支持大数据量存储

redis过滤器

优点:
1、可扩展性Bloom过滤器:一旦Bloom过滤器达到容量,就会在其上创建一个新的过滤器
2、基于redis,不存在重启即失效或者定时任务维护的成本
3、支持分布式场景,拓展性高

缺点:
1、有网络io延迟,性能较guava布隆过滤器低

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

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

相关文章

七月论文审稿GPT第4.5版:通过15K条paper-review数据微调Llama2 70B(含各种坑)

前言 当我们3月下旬微调完Mixtral 8x7B之后(更多详见&#xff1a;七月论文大模型&#xff1a;含论文的审稿、阅读、写作、修订 )&#xff0c;下一个想微调的就是llama2 70B 因为之前积攒了不少微调代码和微调经验&#xff0c;所以3月底apple便通过5K的paper-review数据集成功…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议&#xff0c;连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议&#xff0c;如以太网等&#xff0c;CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的&#xff0c;两边不存在频差&#xff0c;并且内部延时…

使用isort和autopep8统一代码风格

前言 今天和大家分享一篇关于python代码风格统一的方法。我自己之前有使用过&#xff0c;但都是使用公司现成的&#xff0c;没有自己动手去实操&#xff0c;所以为了一探究竟&#xff0c;今天专门花了一点时间去研究&#xff0c;这个过程还挺顺利的&#xff0c;这里我将这个过…

什么是IIoT?

什么是IIoT? IIoT,即工业物联网(Industrial Internet of Things),是指将物联网技术应用到工业领域,通过微型低成本传感器、高带宽无线网络等技术手段,实现工业设备、系统和服务的互联互通,从而提高生产效率、降低能耗和成本,实现智能化和自动化生产。 IIoT的应用范围…

Vitis HLS 学习笔记--BLAS库之WideType

目录 1. WideType 数据类型 2. WideType 类模板参数 2.1 SFINAE技术 3. WideType 类中的函数 3.1 operator[](unsigned int p_Idx) 3.2 operator(const WideType& p_w) const 3.3 getValAddr() 3.4 operator const t_TypeInt() 4. 总结 1. WideType 数据类型 在 …

NtripShare2024年第一季度主要技术进展

迷迷糊糊又是一个月没有写点什么&#xff0c;近期想清楚NtripShare在2024的要做什么事情&#xff0c;暂且将NtripShare要做的主要事情为搭建由软件与硬件之间的技术桥梁。 在过去的几年时间里NtripShare对硬件方面一直是规避的态度&#xff0c;今年开始要做一点软硬件搭界的技…

网络编程初步

协议&#xff1a; 一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物、数、网、传、会、表、应 TCP/IP 4层模型&#xff1a;网&#xff08;链路层/网络接口层)、网、传、应 应用层&#xff1a;http、 ftp、 nfs、 ssh、 telneto o .传输层:TCP、UDP 网络层&…

SpringBoot基于JavaWeb的菜鸟驿站快递管理系统ssm

前端&#xff1a;vue.jsElementUI 编程语言: java 框架&#xff1a; ssm/springboot 详细技术&#xff1a;springboot springbootvueMYSQLMAVEN 数据库: mysql5.7 数据库工具&#xff1a;Navicat/SQLyog都可以 ide工具&#xff1a;IDEA 或者eclipse 对菜鸟驿站快递管理系统设计…

判别饮用水可饮用的多机器学习模型

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 饮用水是人类生存的基本需求之一&#xff0c;也是维护健康和有效保护健康政策的重要组成部分。因此&#xff0c;确保饮用水质量对于国…

3分钟看懂Microchip 32位MCU CAN模块的配置

文章目录 CAN模块系统框图Microchip MCC Harmony下CAN模块配置选项CAN模块工作模式CAN模块中断模式CAN工作速率Bit Timing Calculation配置CAN 接收的配置CAN 发送的配置CAN 过滤器工作流程说明CAN 过滤器的配置 CAN模块系统框图 CAN的英文全称&#xff1a;Control Area Networ…

通过linux工具iftop命令查看视频监控平台是否收到监控摄像头的视频流(视频监控平台接收和转发的视频流)

目录 一、需求描述 二、解决思路 &#xff08;一&#xff09;问题分析 &#xff08;二&#xff09;解决思路 1、通过抓包的方式 2、通过一些linux的网络监视工具 三、需求实现 &#xff08;一&#xff09;抓包工具 1、tcpdump 2、Wireshark 3、tcptrace &#xff0…

OpenHarmony 网络与连接—RPC连接

介绍 本示例使用ohos.rpc 相关接口&#xff0c;实现了一个前台选择商品和数目&#xff0c;后台计算总价的功能&#xff0c;使用rpc进行前台和后台的通信。 效果预览 使用说明&#xff1a; 点击商品种类的空白方框&#xff0c;弹出商品选择列表&#xff0c;选择点击对应的商品…

天软因子数据系列课堂回顾——“委托订单:流动性因子”

高频因子库4月更新&#xff0c;新增5张表单&#xff0c;51个因子。目前&#xff0c;高频因子数量扩容到628个&#xff0c;涵盖了从2000年开始的全A市场。本次“天软因子数据系列课堂”在线分享的即是最新发布因子列表之一的流动性因子&#xff0c;剖析微观角度下因子的底层逻辑…

什么是代理IP?如何正确使用代理IP?

代理IP&#xff08;Proxy IP&#xff09;是一种网络技术&#xff0c;它允许用户通过一个中介服务器&#xff08;即代理服务器&#xff09;来访问互联网。具体来说&#xff0c;代理IP隐藏了用户的真实IP地址&#xff0c;使用第三方的IP地址进行网络访问。当用户发起网络请求时&a…

Linux进阶篇:Centos7搭建smb服务

Centos7搭建smb服务 1 smb介绍 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

基于SpringBoot+Vue的便利店管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;11张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&#…

tcp-learner 数据包分析 20240420

输入输出&#xff1a; 数据包分析&#xff1a; learner和Adapter建立连接。 Learner让Adapter发送RST Adapter没有从SUT抓到任何回复&#xff0c;于是向learner发送timeout learner给adapter发送reset命令&#xff0c;让SUT重置。 这是第一次初始化&#xff0c;由于Adapter和…

7. DAX 时间函数-- DATE 日期--TOTALMTD、TOTALQTD、TOTALYTD

函数名目的语法返回值TOTALMTD计算当前上下文中该月份至今的表达式的值 。TOTALMTD ( <表达式>, <日期列>, [<筛选器>] )标量 表示表达式的标量值&#xff0c;在“日期”中给定日期&#xff0c;计算当前月份至今的日期 。TOTALQTD计算当前上下文中该季度至今…

452. 用最少数量的箭引爆气球[排序+贪心]

https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xst…