布隆过滤器(亿级数据过滤算法)

article/2025/10/31 1:22:44

介绍

我们以演进的方式来逐渐认识布隆过滤器。先抛出一个问题爬虫系统中URL是怎么判重的?你可能最先想到的是将URL放到一个set中,但是当数据很多的时候,放在set中是不现实的。

这时你就可能想到用数组+hash函数来实现了。

index = hash(URL) % table.length

即求出URL的hash值对数组长度取模,得到数组的下标,然后设置table[index] = 1,当然数组刚开始的元素都为0

这样每次有新的URL来的时候,先求出index,然后看table[index]的值,当为0的时候,URL肯定不存在,当为1的时候URL可能存在,因为有可能发生hash冲突。即第一次
hash(www.baidu.com) % table.length = 1,table[1]=1,第二次hash(www.javashitang.com) % table.length = 1,此时table[1]=1,系统会认为www.javashitang.com已经爬取过了,其实并没有爬取。

从上面的流程中我们基本可以得出如下结论:hash冲突越少,误判率越低

怎么减少hash冲突呢?

  1. 增加数组长度
  2. 优化hash函数,使用多个hash函数来判断
    在这里插入图片描述
    多个hash函数求得数组位置的值都为1时才认为这个元素存在,只要有一个为0则认为这个元素不存在。在一定概率上能降低冲突的概率。

那么hash函数是不是越多越好呢?当然不是了,hash函数越多,数组中1的数量相应的也会增多,反而会增加冲突。所以hash函数不能太多也不能太少。

你可能没意识到布隆过滤器的原理你已经懂了,只不过布隆过滤器存0和1不是用数组,而是用位,我们来算一下申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间,是不是很划算?

来总结一下布隆过滤器的特点

  1. 布隆过滤器说某个元素存在,其实有可能不存在,因为hash冲突会导致误判
  2. 布隆过滤器说某个元素不存在则一定不存在

使用场景

  1. 判断指定数据在海量数据中是否存在,防止缓存穿透等
  2. 爬虫系统判断某个URL是否已经处理过

手写一个布隆过滤器

public class MyBloomFilter {//位数组的大小private static final int DEFAULT_SIZE= 2<<24;//hash函数的种子private static final int[] SEEDS = new int[]{3,13,46};//位数组,数组中的元素只能是0或者是1private BitSet bits = new BitSet(DEFAULT_SIZE);//hash函数private SimpleHash[] func = new SimpleHash[SEEDS.length];public MyBloomFilter(){for(int i=0;i<SEEDS.length;i++){func[i]=new SimpleHash(DEFAULT_SIZE,SEEDS[i]);}}//添加元素到位数组public void add(Object value){for(SimpleHash f:func){bits.set(f.hash(value),true);}}//判断指定元素是否存在于位数组public boolean contains(Object value){boolean ret = true;for(SimpleHash f:func){ret = ret && bits.get(f.hash(value));//Hash函数有一个计算出为false,则直接返回if(!ret){return ret;}}return ret;}//Hash函数类public static class SimpleHash{private int cap;private int seed;public SimpleHash(int cap,int seed){this.cap=cap;this.seed=seed;}public int hash(Object value){int h;return (value==null)?0:Math.abs(seed*(cap-1)&(h=value.hashCode())^(h>>>16));}}public static void main(String[] args) {Integer value1=13423;Integer value2=22131;MyBloomFilter filter = new MyBloomFilter();//falseSystem.out.println(filter.contains(value1));//falseSystem.out.println(filter.contains(value2));filter.add(value1);filter.add(value2);//trueSystem.out.println(filter.contains(value1));//trueSystem.out.println(filter.contains(value2));}
}

利用Google的Guava工具库实现布隆过滤器

生产环境中一般不用自己手写的布隆过滤器,用Google大牛写好的工具类即可。
加入如下依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.0.1-jre</version>
</dependency>
public class GoogleGuavaBloom {public static void main(String[] args) {//创建布隆过滤器的对象,最多元素数量为500,期望误报概率为0.01BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(),500,0.01);//判断指定元素是否存在//falseSystem.out.println(filter.mightContain(1));//falseSystem.out.println(filter.mightContain(2));//将元素添加进布隆过滤器filter.put(1);filter.put(2);//trueSystem.out.println(filter.mightContain(1));//trueSystem.out.println(filter.mightContain(2));}
}

用Redis中的布隆过滤器

Redis4.0以插件的形式提供了布隆过滤器。来演示一波
使用docker安装并启动

docker pull redislabs/rebloom
docker run -itd --name redis -p:6379:6379 redislabs/rebloom
docker exec -it redis /bin/bash
redis-cli

常用的命令如下

#添加元素  
bf.add
#查看元素是否存在
bf.exists
#批量添加元素
bf.madd
#批量查询元素
bf.mexists
127.0.0.1:6379> bf.add test 1
(integer) 1
127.0.0.1:6379> bf.add test 2
(integer) 1
127.0.0.1:6379> bf.exists test 1
(integer) 1
127.0.0.1:6379> bf.exists test 3
(integer) 0
127.0.0.1:6379> bf.exists test 4
(integer) 0

http://chatgpt.dhexx.cn/article/TJjMx9dQ.shtml

相关文章

Pandas的数据过滤

作者|Amanda Iglesias Moreno 编译|VK 来源|Towards Datas Science 从数据帧中过滤数据是清理数据时最常见的操作之一。Pandas提供了一系列根据行和列的位置和标签选择数据的方法。此外,Pandas还允许你根据列类型获取数据子集,并使用布尔索引筛选行。 在本文中,我们将介绍…

数据过滤:SQL数据过滤都有哪些方法?

我在上篇文章中讲到过&#xff0c;提升查询效率的一个很重要的方式&#xff0c;就是约束返回结果的数量&#xff0c;还有一个很有效的方式&#xff0c;就是指定筛选条件&#xff0c;进行过滤。过滤可以筛选符合条件的结果&#xff0c;并进行返回&#xff0c;减少不必要的数据行…

数据过滤(MySQL)

数据过滤 数据过滤用在WHERE表达式里&#xff0c;常用的有基本查询过滤、条件查询过滤、模糊查询过滤、字段查询过滤以及正则表达式查询过滤。 一、基本查询过滤 基本查询过滤可以查询所有字段数据或指定一个字段或者多个字段的数据。 附带建表 mysql> create table use…

掌握这些数据过滤的技巧,再复杂的业务数据也能高效处理!

随着互联网的飞速发展&#xff0c;呈爆炸式增长的数据使用户逐渐迷失在了信息的海洋之中&#xff0c;在进行数据分析时&#xff0c;海量的业务数据往往会带来一些问题&#xff1a; 准确性差&#xff1a;无效数据以及无需进行分析的数据混杂在其中&#xff0c;导致分析结果与实际…

阿里云服务器初始化

初始化阿里云服务器 进入阿里云服务器&#xff0c;然后在 配置信息 点击 重新初始化磁盘 接着会出现一个提示框&#xff0c;点击 确认 即可 进入实例云盘中&#xff0c;点击 重新初始化磁盘 然后设置密码 完成这一步后&#xff0c;输入手机验证码。这时阿里云服务器就被初始…

腾讯云服务器如何开启虚拟化,腾讯云服务器虚拟化驱动是什么

腾讯云服务器虚拟化驱动是什么&#xff1f; 云服务器虚拟化驱动&#xff0c;为腾讯自研开发&#xff0c;专门用于虚拟化效率提升的驱动程序&#xff0c;云服务器虚拟化驱动在linux系统中驱动文件名是pvdriver&#xff0c;安装路径:/usr/local/qcloud/pvdriver/bin&#xff0c;在…

金山办公CEO章庆元:数字化、云化、订阅化趋势下,组织数字办公走向纵深

关注ITValue&#xff0c;看企业级最新鲜、最价值报道&#xff01; 企业办公行业今年有3个关键词——数字化、云化、订阅化。 从数字化来说&#xff0c;国家十四五规划明确提出了“加快建设数字经济、数字社会、数字政府&#xff0c;以数字化转型整体驱动生产方式、生活方式和治…

物联网端-云一体化应用管理解决方案

近年来&#xff0c;随着云计算的发展&#xff0c;“云边端一体化”、“云端协同”等词也频繁出现在大众眼。 什么是“端-云一体化”&#xff1f; 这里我们拆开来解释&#xff1a; 云&#xff1a;云计算、云数据中心&#xff1b; 端&#xff1a;指的是终端。 合起来的意思就是…

CloudCore引领核心网云化转型

文/刘皓 2015年7月&#xff0c;全球著名咨询公司IHS Infonetics发布最新NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;市场调研报告。报告显示&#xff0c;NFV市场空间将从2014年的9.5亿美元增长到2019年的116亿美元&#xff0c;年…

全面推进云化,使能数字化转型 ——徐直军在2016华为全球分析师大会上的发言

文/徐直军 女士们、先生们&#xff0c;各位老朋友、新朋友&#xff0c;大家上午好&#xff01;非常高兴在同样的地点跟各位老朋友再相会&#xff0c;也非常欢迎各位新朋友来参加华为2016年的分析师大会。 这次大会的组委会给我定的主题是《全面推进云化&#xff0c;使能数字化转…

阿里云人物动漫化

简介 使用阿里云人物动漫化功能制作一款属于自己的专属头像(该功能收费) 功能描述 人物动漫化能力可以将一张人物图像进行转换处理&#xff0c;生成二次元卡通形象&#xff0c;并返回动漫化后的结果图像。效果示例如下。 原图&#xff1a; 日漫风结果图&#xff1a; 3D特效结…

服务器虚拟化与云平台,虚拟服务器和云有哪些区别

原标题&#xff1a;虚拟服务器和云有哪些区别 虚拟服务器和云有哪些区别&#xff1f;如果不是专业的人员&#xff0c;其实对于服务器是搞不懂的&#xff0c;其实虚拟服务器和云都是对硬件的抽象&#xff0c;两者都有很多好处和使用的理由&#xff0c;那么服务器虚拟化和云的区别…

腾云忆想构建云化IT生态,助力我国“双循环经济”数字化升级

新冠肺炎疫情全球蔓延,世界经济与国际局势瞬息万变。时局变化之中展望“十四五”,我国逐步形成了以国内大循环为主体、国内国际双循环相互促进的新发展格局。在新时局中,数字经济是重要的支撑力量,产业的数字化转型成为不可逆的趋势。 面对时代变局,腾云忆想紧抓历史机遇,与腾…

欢迎参与2020年云栖大会——引领企业基础设施云化

**简介&#xff1a;**2020年9月18日&#xff0c;阿里云邀您参加2020年云栖大会——引领企业基础设施云化分会场。 2020年9月18日&#xff0c;阿里云邀您参加2020年云栖大会——引领企业基础设施云化分会场。 在数字新基建时代&#xff0c;IT基础设施成为企业数字化转型的一个瓶…

何朝曦:构建云化安全能力的三个建议

11月12日&#xff0c;深信服智安全创新峰会在云端拉开帷幕&#xff0c;深信服创始人&CEO何朝曦在《构建云化时代的安全能力》主题演讲中指出&#xff0c;业务云化已成为用户实现数字化转型与变革的重要方式&#xff0c;这种跨时代的变迁对用户的安全能力提出了更高的要求&a…

英特尔TCI技术落地,锐捷网络发布OCS终端云化新品

编辑 | 宋慧 出品 | CSDN 云计算 2021 年 6 月&#xff0c;国内一直深耕桌面虚拟化的厂商锐捷正式发布了新一代云桌面解决方案——锐捷三擎云桌面解决方案&#xff08; “精耕细作”桌面云市场的锐捷&#xff0c;重磅发布三擎云桌面 &#xff09;&#xff0c;其中三擎指的是终端…

云服务器虚拟化搭建,虚拟化搭建云服务器

虚拟化搭建云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接M…

云化要求下,数据库架构的演进

如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构的需求。 微服务&#xff0c;也就是一种面向服务的&#xff0c;有特定边界的松散耦合的架构。 主要…

【术语】本地部署、云化部署、混合部署

本地部署就是由用户在自己本地部署服务器环境&#xff0c;本地管理。 云化部署就是采用云化的方案&#xff0c;也叫SaaS模式&#xff0c;使用厂商提供的云服务器。 混合部署&#xff0c;就是一部分上云&#xff0c;一部分本地。

科技云报道:全面云化时代,企业需要怎样的云安全能力?

科技云报道原创。 云安全&#xff0c;无论何时提起&#xff0c;其重要性都不容小觑。 根据网络安全机构Sophos的研究&#xff0c;云安全事件正在时刻发生。根据该公司发布的《2021年云安全状况》显示&#xff0c;近四分之三的企业遭受了云安全攻击&#xff0c;其中恶意软件、…