关注过 @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 年,你在干嘛?还不知道布隆过滤器相关推荐

  1. mysql怎么用_面试官都是这样发问的,连环冲锋炮,看你怎么抵挡(上)

    本内容来源于和尚 16 年毕业的学长,先在 58,后阿里,如今准备跳槽了,以下内容为他的最近面试经历 我最近从大厂离职之后在合肥呆了个把月,之前已经准备了半个多月,从7月底开始投简历面试,目前是jav ...

  2. 踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”

    摘要:你是否在总是听到"内存越界","指针指向了非法地址"等常见问题呢?但是在面试过程中总有一些学术严谨(装13)的面试官给这一类问题取个名字-踩内存.如果你没 ...

  3. sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?

    目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...

  4. js中立即执行函数会预编译吗_面试官:聊聊对Vue.js框架的理解

    作者:yacan8 https://github.com/yacan8/blog/issues/26 本文为一次前端技术分享的演讲稿,所以尽力不贴 Vue.js 的源码,因为贴代码在实际分享中,比较枯 ...

  5. 上一家单位离职的原因_面试官:你为什么从上一家公司离职?小伙更换答案后,立马被录取...

    分享职场故事,交流职场经验,欢迎关注"闫湘". 01 面试被秒拒:谁让你瞎说大实话 赵东在上一家公司离职之后,就立刻投入了求职大潮,但是现在的工作情况并不乐观.因为虽然岗位众多,但 ...

  6. 「从源码中学习」面试官都不知道的Vue题目答案

    前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...

  7. java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了

    java阿里面试官直接告诉你录取答案,你还在犹豫那就晚了 2022-03-11 16:49·LBL-埃文斯 前言 阿里巴巴面试规则 1.第一轮面试: 第一轮面试通常是电话面试,面试官会提前打电话约定面 ...

  8. 程序员面试快手后感慨:你们经历过绝望吗?三个面试官都是清华的

    一名程序员在面试完快手后如此感叹:快手的要求确实高,比阿里难进100倍,三个面试官都是清华的,全是问的acm和算法题. 所谓同行相轻,马上又网友评论:题刷得好不代表解决问题能力强,面试一般考一两个考察 ...

  9. 视频面试,面试官都在注意些什么?

    受疫情的影响,"视频面试"功能成功解了企业避免"面对面"招聘的燃眉之急,也为求职者也带来了极大的便利. 随着视频面试的热度不断攀升,人们讨论的话题和热度自然也转 ...

最新文章

  1. linux xargs 前一条命令的输出作为下一条命令的参数
  2. [FFmpeg] ffmpeg 常用命令
  3. 使用axios上传照片
  4. Qt/C++工作笔记-vector与QVector的拷贝复制(区别与联系)
  5. memcache 知识点
  6. 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
  7. 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
  8. 音频编解码-speex库的使用方法
  9. MySQL复制一张表数据到另一张新表
  10. 阿里云云计算ACP学习(七)---弹性伸缩服务AS
  11. 女子花2万元雇友人杀逝世女街坊
  12. 用机器学习自制二手房估价模型(附完整过程)
  13. kdj超卖_如何正确理解KDJ?
  14. java程序设计 秒表计时器_【Java】Java计时器(秒表)
  15. 【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 )
  16. 【Python】浮点数精度问题(包含解决方案)
  17. 索尼xz2android设置向导,安卓9.0上线:索尼XZ2 Premium更新喜迎全面屏新操作!
  18. 无缝大世界之无缝连接Terrain转mesh
  19. Apache Commons 总纲
  20. Tensorflow学习笔记(六)均方误差损失函数,MSE

热门文章

  1. 留学计算机美国硕士,美国硕士留学计算机专业有哪些名校推荐下?
  2. Java中introduce方法_Java基础—继承
  3. MySQL对字符集_对MySQL字符集的认识
  4. pythonqt4上位机开发_上位机开发之单片机通信实践(一)
  5. SQLSERVER查询存储过程内容
  6. [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
  7. 机器学习(课程笔记4)——逼近参数算法牛顿方法;
  8. 元素位置及宽度的计算总节
  9. Java并发编程实战笔记—— 并发编程1
  10. js时间格式化函数(兼容IOS)