布隆过滤器原理浅析

前言

熟悉Redis缓存应用的伙伴们都知道,Redis缓存存在缓存击穿、雪崩和穿透的问题,通常在解决缓存穿透问题时,除了缓存异常请求外,还有一个叫做布隆过滤器的方案。下面,我们认识下布隆过滤器。

结构&原理

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。根据上述百度百科的描述,我们可以大致画出布隆过滤器的结构,如下
在这里插入图片描述
在初始情况下,我们可以将其看作一个很长的二进制数组,默认每个位置为0,当新增元素的时候,通过一系列Hash函数计算出这个元素的向量下标,然后填入二进制数组中,如下
在这里插入图片描述
这样,“张三”通过n个Hash函数映射到n个数组下标的位置上标记,同理,这时如果再来“李四”、“王五”等元素,也是通过n个Hash函数映射,这样,就有可能会导致有些值通过不通的Hash函数映射到同一个下标的位置,如下所示
在这里插入图片描述
在这里插入图片描述
那么,如何查询元素呢?在查询元素时,也是通过n个不同hash函数将元素映射到n个点,然后判断这n个位置的值是否为1,这样,就会有两个结论:

  • n个位置全是1,元素可能存在
  • 有至少一个位置是0,元素不存在

从上图我们可以看出,张三这个元素查询时,可能是由李四和王五两个元素的位置覆盖得出的1,因此,即使所有位置都为1,也不能完全确认张三存在。基于此问题,我们可以调整布隆过滤器的长度和随机映射函数,来减少元素碰撞。同样基于上述情况,我们可以很清晰的知道,布隆过滤器万万不能删除元素,因为你不知道同一下标对应多少元素。

SpringBoot简单测试

谷歌开源的Guava自带布隆过滤器,首先引入依赖

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

然后,我们设置好布隆过滤器的长度和误判率,插入对应的数据,例如插入1-1000000作为100万个测试数据,然后,查询1000001-2000000数据在布隆过滤器是否存在,查看它的误判数,从而计算真实的误判率,如下

package com.example.test.redis;import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;import java.text.NumberFormat;public class BloomFilterTest {/*** 预计要插入多少数据*/private static int size = 1000000;/*** 期望的误判率*/private static double fpp = 0.001;/*** 布隆过滤器*/private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(),size,fpp);public static void main(String[] args) {//插入样本数据for(int i=0; i<size; i++){bloomFilter.put(i);}//另外十万测试数据,预测误判率int count = 0;for(int i=size; i<size+1000000; i++){if(bloomFilter.mightContain(i)){count++;System.out.println(i+"误判了");}}NumberFormat nf = NumberFormat.getInstance();//关闭科学计数法nf.setGroupingUsed(false);//定义保留几位小数nf.setMaximumFractionDigits(8);System.out.println("总共误判数:"+count+",真实误判率为:"+nf.format((double)count/1000000.00));}
}

运行结果如下
在这里插入图片描述
如果我们调整判断数据量,会发现误判率超过了我们的期望值,这也说明随着数据量增大,误判率也会增加,这就要我们调整布隆过滤器的长度和随机映射函数了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适合自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1a; 1&#xff09;线下CTF比赛培训中存在严重的 “最后一公里”问题 &#…

2023年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位安…

微信小程序报错request:fail -2:net::ERR_FAILED(生成中间证书)

微信小程序报错request:fail -2:net::ERR_FAILED-生成中间证书 前言一、检查网站ssl证书二、生成证书方法1.获取中间证书手动合并1.进入网站&#xff1a;[https://www.myssl.cn/tools/downloadchain.html](https://www.myssl.cn/tools/downloadchain.html)2.点击下一步3.手动合…

(十四)VBA常用基础知识:当前excel文件所有sheet循环,获取sheet名,获取最大行数最大列数

获取当前excel的所有sheet以及sheet名 Sub test()Dim ws As WorksheetFor Each ws In Worksheetsws.ActivateDebug.Print ws.NameNext ws End Sub 输出结果&#xff1a; Sheet1 Sheet2 Sheet3 Sheet4 Sheet52.获取最大行数 首先要明白取最大行的方式&#xff0c;为什么这样取…

【技术干货】如何快速创建商用照明 OEM APP?

本文介绍了如何在涂鸦 IoT 平台的 App 工作台上创建一款体验版商照 App、正式版 OEM App、上架 App、以及完成通用配置。 OEM App 开发 创建 App 登录 涂鸦 IoT 平台的 App 页面。 单击 创建APP&#xff0c;选择 商照 APP 进行创建。 在提示框里&#xff0c;完善 App 信息…

c++ 学习之 强制类型转换运算符 const_cast

看例子怎么用 int main() {int a 1;int* p a;// 会发生报错// 如果学着 c的风格类型转换int* pp (int*)a;*pp 1; // 编译不报错&#xff0c;但是运行报错// const_castconst int n 5;const std::string s "lalal";// const cast 只针对指针&#xff0c;引用&…

【考研408常用数据结构】C/C++实现代码汇总

文章目录 前言数组多维数组的原理、作用稀疏数组 链表单向链表的增删改查的具体实现思路约瑟夫环问题&#xff08;可不学&#xff09;双向链表 树二叉搜索树中序线索二叉树哈夫曼树的编码与译码红黑树B树B树 堆顺序与链式结构队列实现优先队列排序算法&#xff08;重点&#xf…

Windows提权

1. MySQL提权 1.1 UDF提权 udf ‘user defined function’&#xff0c;即’用户自定义函数’。是通过添加新函数&#xff0c;对MYSQL的功能进行扩充 1、如何获得udf文件 2、将文件放到哪才能让mysql承认这个函数 3、函数功能 4、为什么这东西能提权(自定义函数指令是直接…

【AIGC】如何在使用stable-diffusion-webui生成图片时看到完整请求参数

文章目录 背景开搞使用遇到的问题 背景 通过代码调用Stable Diffusion的txt2img、img2img接口时&#xff0c;很多时候都不知道应该怎么传参&#xff0c;比如如何指定模型、如何开启并使用Controlnet、如何开启面部修复等等&#xff0c;在sd-webui上F12看到的请求也不是正式调用…

多线程 - 锁策略 CAS

常见的锁策略 此处谈到的锁策略,不局限于 Java,C,Python,数据库,操作系统……但凡是涉及到锁,都是可以应用到下列的锁策略的 乐观锁 vs 悲观锁 锁的实现者,预测接下来锁冲突(锁竞争,两个线程针对一个对象加锁,产生阻塞等待了)的概率是大,还是不大,根据这个冲突的概率,来接下…

选择同步云盘工具?这些值得一试的优秀选择!

对于云盘用户而言&#xff0c;同步功能是影响产品选择的重要因素。在日常办公过程中&#xff0c;我们难免会遇到需要查看文件&#xff0c;但是存储文件的原设备不在身边的情况。这个时候同步云盘的重要性就显现出来了. 同步云盘的优势 文件同步&#xff1a;同步云盘可以将文件…