问题

老顾先来举个常会问到的面试题:现有50亿个电话号码,现有10万个电话号码,如何要快速准确的判断这些电话号码是否已经存在?

上面的问题可以细化一下,也就是50亿个电话号码在数据库中,现在要快速、准确的判断提供的10万个电话号码是否存在。

我们小伙伴们是否脑子中会有以下方案:

实际项目中也会遇到类似的问题,如垃圾邮件过滤、网络爬虫重复url检测等,本质就是判断数据存不存在一个大的集合中。

那如何去解决呢?这就是我们今天老顾要介绍的布隆过滤器方案,我们继续往下看。

#布隆过滤器

布隆过滤器是一种类似set的数据结构,只是不太准确,当判断元素是否存在时返回结果存在但真实不一定存在;当返回不存在时肯定是不存在,所以判断去重时有一定的误判概率。

当然,误判只会发生在过滤器没有添加过的元素,对于添加过的元素不会发生误判。

特点:高效地插入和查询,占用空间少,返回的结果是不确定性的。

#布隆过滤器原理

这个是由柏顿.布隆在1970年提出,用很小的空间,解决上述的类似问题。

实现原理就是我们需要一个很长的二进制数组(也叫向量);在添加数据时,使用多个hash函数对key进行hash运算得到一个索引值(即二进制数组的索引值)

上图中,下面是很长的二进制数组,第二层就是多个hash函数,再上面就是数据。

上图中,每个数据经过多个hash函数计算,得到索引值,并把二进制数组对应的索引值那边设置为1,我们发现经过三次hash就会在三个索引的地方设置为1,也就是代表此数据存在。

#布隆过滤器误差

空间占用

布隆过滤器的空间占用有一个简单的计算公式,但推导比较繁琐。布隆过滤器有两个参数,预计元素数量n,错误率f,公式得到两个输出,位数组长度L(即存储空间大小bit),hash函数的最佳数量k。

k = 0.7*(1/n)
f = 0.6185^(L/n)

实际元素超出时

以上小伙伴们只要知道会存在误差就行了,不需要强求是怎么计算的。

#Redis布隆过滤器的基本使用

在Redis中,布隆过滤器有两个基本命令,分别是:

  • bf.add添加元素到布隆过滤器中,类似于集合的sadd命令,不过bf.add命令只能一次添加一个元素,如果想一次添加多个元素,可以使用bf.madd命令。

  • bf.exists判断某个元素是否在过滤器中,类似于集合的sismember命令,不过bf.exists命令只能一次查询一个元素,如果想一次查询多个元素,可以使用bf.mexists命令。

#布隆过滤器的高级使用

上面的例子中使用的布隆过滤器只是默认参数的布隆过滤器,它在我们第一次使用 bf.add 命令时自动创建的。Redis还提供了自定义参数的布隆过滤器,想要尽量减少布隆过滤器的误判,就要设置合理的参数。

在使用 bf.add 命令添加元素之前,使用bf.reserve 命令创建一个自定义的布隆过滤器bf.reserve命令有三个参数,分别是:

  • key:键

  • error_rate:期望错误率,期望错误率越低,需要的空间就越大。

  • capacity:初始容量,当实际元素的数量超过这个初始化容量时,误判率上升。

比如:

如果对应的key已经存在时,在执行bf.reserve命令就会报错。如果不使用bf.reserve命令创建,而是使用Redis自动创建的布隆过滤器,默认的error_rate是 0.01,capacity是 100。

布隆过滤器的error_rate 越小,需要的存储空间就越大,对于不需要过于精确的场景,error_rate设置稍大一点也可以。布隆过滤器的capacity设置的过大,会浪费存储空间,设置的过小,就会影响准确率,所以在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避免实际元素可能会意外高出设置值很多。总之,error_ratecapacity都需要设置一个合适的数值。

#布隆过滤器的应用

解决缓存穿透的问题

一般情况下,**先查询缓存是否有该条数据,缓存中没有时,再查询数据库。**当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。缓存穿透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。

可以使用布隆过滤器解决缓存穿透的问题,把已存在数据的key存在布隆过滤器中。当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在该条数据直接返回;如果存在该条数据再查询缓存查询数据库。

黑名单校验

发现存在黑名单中的,就执行特定操作。比如:识别垃圾邮件,只要是邮箱在黑名单中的邮件,就识别为垃圾邮件。假设黑名单的数量是数以亿计的,存放起来就是非常耗费存储空间的,布隆过滤器则是一个较好的解决方案。把所有黑名单都放在布隆过滤器中,再收到邮件时,判断邮件地址是否在布隆过滤器中即可。

#总结

今天老顾带着大家了解了redis布隆过滤器的原理以及应用场景;希望能给小伙伴带来帮助,谢谢!!

最后

给大家送上一份福利,领取方式:戳这里免费下载

Java架构进阶面试及知识点文档笔记

这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理

Java分布式高级面试问题解析文档

其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!

互联网Java程序员面试必备问题解析及文档学习笔记

Java架构进阶视频解析合集

GJzS-1623506144956)]

互联网Java程序员面试必备问题解析及文档学习笔记

[外链图片转存中…(img-GRmBcRHV-1623506144956)]

Java架构进阶视频解析合集

这些知识点你会吗?redis的分布式布隆过滤器含答案解析相关推荐

  1. Redis的分布式布隆过滤器是什么原理?

    [原创] 老顾聊技术 2020-08-07 23:01:58 欢迎关注头条号:老顾聊技术 精品原创技术分享,知识的组装工 问题 老顾先来举个常会问到的面试题:现有50亿个电话号码,现有10万个电话号码 ...

  2. 2020年Redis面试题总结(30道题含答案解析)

    2020年Redis面试题总结(30道题含答案解析) 这个是整理的思维导图,给大家分享一下. 1. 什么是 Redis?简述它的优缺点? (1)Redis 的全称是:Remote Dictionary ...

  3. 布隆过滤器 redis_使用基于 Redis 的 Java 布隆过滤器

    (给数据分析与开发加星标,提升数据技能) 转自:ImportNew 布隆过滤器是一种概率数据结构,用来高效地测试集合中是否存在某个元素.使用布隆过滤器有助于减少在磁盘中查找键值的次数,从而降低开销. ...

  4. redis布隆过滤器PHP,Redis 中的布隆过滤器

    什么是『布隆过滤器』 布隆过滤器是一个神奇的数据结构,可以用来判断一个元素是否在一个集合中.很常用的一个功能是用来去重.在爬虫中常见的一个需求:目标网站 URL 千千万,怎么判断某个 URL 爬虫是否 ...

  5. 第六章 商品详情进阶 + redis分布式锁 + redis问题解决 + redisson + 布隆过滤器

    一.商品详情页面优化 1.1 思路 虽然咱们实现了页面需要的功能,但是考虑到该页面是被用户高频访问的,所以性能需要优化. 一般一个系统最大的性能瓶颈,就是数据库的io操作.从数据库入手也是调优性价比最 ...

  6. 【2021最新版】Redis面试题总结(50道题含答案解析)

    文章目录 1.什么是Redis? 2.Redis与其他key-value存储有什么不同? 3.Redis的数据类型? 4.使用Redis有哪些好处? 5.Redis相比Memcached有哪些优势? ...

  7. 三种去重方式——HashSet、Redis去重、布隆过滤器(BloomFilter)

    三种去重方式 去重就有三种实现方式,那有什么不同呢? HashSet 使用java中的HashSet不能重复的特点去重.优点是容易理解.使用方便. 缺点:占用内存大,性能较低. Redis去重 使用R ...

  8. Redis实现的布隆过滤器如何快速有效删除数据

    这不是一篇搭建教程,因为用Redis实现布隆过滤器很简单,Redis本身就支持bitmap这种数据结构,通过setbit和getbit即可实现一个Bloom Filter.本文要讨论的是测试过程中,或 ...

  9. 13.Redis系列之布隆过滤器

    本文讲解redis中海量数据去重利器布隆过滤器Bloom Filter,强烈建议先全文大概浏览一遍在进行操作,里面笔者遇到的坑大都记录了 1. windows安装make命令 如果想获取make编译好 ...

最新文章

  1. Linux下zkui的安装
  2. php对称字符串,PHP实现简单的对称加密和解密方法 - str_split
  3. [html]请描述HTML元素的显示优先级
  4. 面试官重点考察求职者这5项能力
  5. Android学习笔记---HttpClient入门,使用方法,及简介
  6. github连接出现Bad file number问题
  7. JSTL和EL的使用
  8. centos下yum安装lamp
  9. 显控触摸屏编程手册_深圳显控AKWORKSHOP触摸屏与ALLENBRADLEY通讯手册.pdf
  10. BGP双平面实验---bgp的选路
  11. python程序中每条语句以分号结尾,在Python程序中,每条语句末尾必须添加分号。...
  12. matlab中根据表格数据画图,excel 表格数据画图-如何利用matlab根据excel表格里面的数据画图...
  13. 【Axure教程】拖动排序——扣款顺序
  14. Linux高性能集群(AMD处理器)Linpack测试方法
  15. Python爬虫项目分享二:《爬取周杰伦的歌曲评论》
  16. 数据库 存储过程的建立 调用 加密
  17. python查询手机号信息
  18. Springboot+Mongodb实现汽车美容服务管理
  19. 空调器制冷系统故障-蒸发器反面脏堵
  20. 《暗黑2》经典数值公式分析总结(三)

热门文章

  1. TypeError: __init__() got an unexpected keyword argument #34serialized_options #34
  2. Python递归实现快速排序
  3. makefile多文件编译
  4. expected unqualified-id before numeric constant问题原因
  5. access检查为空函数
  6. STP与RSTP也不过就这些区别
  7. python 中的for i in range()的使用(for _ in range())
  8. 试用过期_过期的护肤品彩妆你都是怎么处理的呢?这样做,可以省一大笔钱
  9. arch linux引导不启动_Linux 内核源代码的目录结构
  10. springwebflux 页面_Spring WebFlux 入门