golang实现的布隆过滤器_面试官:都 2020 年,你在干嘛?还不知道布隆过滤器
关注过 @Python大星 的小伙伴应该知道,2020 年 4 月 Python 小星最近裸面了阿里巴巴菜鸟网络科技有限公司。
一面中面试官非常重视解决 Redis 缓存穿透问题的利器--布隆过滤器,关于 Python 小星菜鸟二面的情况,后续整理出来。
今天我们来盘一盘“布隆过滤器” 到底是何方妖孽?
一、布隆过滤器(Bloom Filter)
布隆
对不起,搞错啦,不是这个“布隆”。
但是,这个“布隆过滤器”中的“布隆” 确实是个人名,1970 年提出的,用来测试一个元素是否在一个集合里。有可能” 误报 “,但肯定不会” 错报 “:对布隆过滤器的一次查询要么返回 “可能在集合中 “,要么” 肯定不在集合里 “。
举个例子,古代进城搜捕凶手,人物画像的特征太多,可能会让凶手蒙混过关进城,但是有些人可以肯定不是凶手,比如高矮胖瘦都不符合画像的。
如果你前面理解了,我们再来说下专业术语:
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数,可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
二、为什么我们在 Redis 缓存穿透要用布隆过滤器?
如果不用会出现什么情况?
我们通常用 Redis 做缓存层,减少 Mysql 数据库的连接次数。
使用 Redis 避免不了一个“缓存穿透”的问题,
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 中去查询,失去了缓存的意义。在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。
如果我们这里加上“布隆过滤器”,就可以缓解“缓存穿透”对 Mysql 数据库的请求压力。
三、布隆过滤器的原理
布隆过滤器会通过一定的错误率换取空间。
布隆过滤器通过 bit 数组来标识数据
假设 1 个元素只占一个坑,位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。
那么申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。
如果你对 hashmap 原理熟悉的话,这个布隆过滤器的原理就很容易理解了。
缺点1:为什么说布隆过滤器有一定误识别率???
这是因为 hash算法计算出来的值会出现冲突,这就是我们常说的hashmap中的 hash 冲突一样,比如我们数据没有 id = 999 的,但是计算出来的值可能和已标识为 1 的值冲突,被“布隆过滤器” 误识别。
那有小伙伴会问,如何提高布隆过滤器的识别率呢?
从 3 个方面可以提高:
① bit 数组长度
② hash 函数的个数
这就和买彩票一样,数字越多,中奖概率越低。hash 函数的个数不是越多越好,需要参考 bit 数组的长度。
③ 如果布隆过滤器存储的是黑名单,那么可以建立小的白名单,存储那些被误判的信息。
布隆过滤器误判:
如果布隆过滤器说数据存在,那有可能不存在,输入误判;
如果布隆过滤说数据不存在,那一定不存在。
缺点2:为什么说布隆过滤器删除困难???
一个放入容器的元素映射到 bit 数组的 k 个位置上是 1,删除的时候不能简单的直接置为 0,可能会影响其他元素的判断。
如何解决布隆过滤器删除困难的问题???
Counting Bloom Filter,它将标准 Bloom Filter 位数组的每一位扩展为一个小的计数器 (Counter),在插入元素时给对应的 k(k 为哈希函数个数) 个 Counter 的值分别加 1,删除元素时给对应的 k 个 Counter 的值分别减 1,Counting Bloom Filter 通过多占用几倍的存储空间的代价,给 Bloom Filter 增加了删除操作。
四、布隆过滤器实现
1、如何确定 bit 数组的长度和 hash 函数的个数
已知条件
- 存储数量为 n
- 预期误判率 为 fpp(False positive probability)
计算
- Bit 数组大小 m
- 哈希函数个数 k
① Bit 数组选择
② hash 函数个数
2、布隆过滤器的实现
Guava 中就提供了一种 Bloom Filter 的实现。
① 在 springboot 项目中引入 maven 依赖
② 布隆过滤器测试
测试结果:
从上面的简单测试,我们可以看到误判率 320 / 10000 = 0.032.
从源码中我们也可以看出 fpp = 0.03
注意:
BloomFilter.create(Funnels.integerFunnel(), n, fpp);// 可以设置自定义设置误判率
@Python大星 | 文
golang实现的布隆过滤器_面试官:都 2020 年,你在干嘛?还不知道布隆过滤器相关推荐
- mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)
本内容来源于和尚 16 年毕业的学长,先在 58,后阿里,如今准备跳槽了,以下内容为他的最近面试经历 我最近从大厂离职之后在合肥呆了个把月,之前已经准备了半个多月,从7月底开始投简历面试,目前是jav ...
- 踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”
摘要:你是否在总是听到"内存越界","指针指向了非法地址"等常见问题呢?但是在面试过程中总有一些学术严谨(装13)的面试官给这一类问题取个名字-踩内存.如果你没 ...
- sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?
目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...
- js中立即执行函数会预编译吗_面试官:聊聊对Vue.js框架的理解
作者:yacan8 https://github.com/yacan8/blog/issues/26 本文为一次前端技术分享的演讲稿,所以尽力不贴 Vue.js 的源码,因为贴代码在实际分享中,比较枯 ...
- 上一家单位离职的原因_面试官:你为什么从上一家公司离职?小伙更换答案后,立马被录取...
分享职场故事,交流职场经验,欢迎关注"闫湘". 01 面试被秒拒:谁让你瞎说大实话 赵东在上一家公司离职之后,就立刻投入了求职大潮,但是现在的工作情况并不乐观.因为虽然岗位众多,但 ...
- 「从源码中学习」面试官都不知道的Vue题目答案
前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...
- java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了
java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了 2022-03-11 16:49·LBL-埃文斯 前言 阿里巴巴面试规则 1.第一轮面试: 第一轮面试通常是电话面试,面试官会提前打电话约定面 ...
- 程序员面试快手后感慨:你们经历过绝望吗?三个面试官都是清华的
一名程序员在面试完快手后如此感叹:快手的要求确实高,比阿里难进100倍,三个面试官都是清华的,全是问的acm和算法题. 所谓同行相轻,马上又网友评论:题刷得好不代表解决问题能力强,面试一般考一两个考察 ...
- 视频面试,面试官都在注意些什么?
受疫情的影响,"视频面试"功能成功解了企业避免"面对面"招聘的燃眉之急,也为求职者也带来了极大的便利. 随着视频面试的热度不断攀升,人们讨论的话题和热度自然也转 ...
最新文章
- linux xargs 前一条命令的输出作为下一条命令的参数
- [FFmpeg] ffmpeg 常用命令
- 使用axios上传照片
- Qt/C++工作笔记-vector与QVector的拷贝复制(区别与联系)
- memcache 知识点
- 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
- 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
- 音频编解码-speex库的使用方法
- MySQL复制一张表数据到另一张新表
- 阿里云云计算ACP学习(七)---弹性伸缩服务AS
- 女子花2万元雇友人杀逝世女街坊
- 用机器学习自制二手房估价模型(附完整过程)
- kdj超卖_如何正确理解KDJ?
- java程序设计 秒表计时器_【Java】Java计时器(秒表)
- 【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 )
- 【Python】浮点数精度问题(包含解决方案)
- 索尼xz2android设置向导,安卓9.0上线:索尼XZ2 Premium更新喜迎全面屏新操作!
- 无缝大世界之无缝连接Terrain转mesh
- Apache Commons 总纲
- Tensorflow学习笔记(六)均方误差损失函数,MSE
热门文章
- 留学计算机美国硕士,美国硕士留学计算机专业有哪些名校推荐下?
- Java中introduce方法_Java基础—继承
- MySQL对字符集_对MySQL字符集的认识
- pythonqt4上位机开发_上位机开发之单片机通信实践(一)
- SQLSERVER查询存储过程内容
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
- 机器学习(课程笔记4)——逼近参数算法牛顿方法;
- 元素位置及宽度的计算总节
- Java并发编程实战笔记—— 并发编程1
- js时间格式化函数(兼容IOS)