布隆过滤器

我们在《Redis缓存穿透、缓存击穿和雪崩》中说过,解决缓存穿透的有效办法之一就是使用布隆过滤器。实际上,布隆过滤器不仅仅可以解决缓存穿透的问题,还被广泛应用于网页黑名单系统、垃圾邮件过滤系统、爬虫网址判重等系统,那到底什么是布隆过滤器,今天我们就来揭开它的神秘面纱。

一、布隆过滤器的应用场景

我们先来看下布隆过滤器的应用场景,看看它到底能做什么。

1、解决(缓解)缓存穿透

我们经常会把一些热点数据放在Redis缓存中,比如产品信息等。当有查询请求进来时,我们可以根据产品Id直接去缓存中取数据,而不用读数据库,这是提升性能最简单,最普遍,也是最有效的做法。

一般的查询流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去查数据库,再把数据库取出来的数据放入缓存,一切看起来很美好。但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么大量的请求都怼到数据库,数据库的压力一下子就上来了,还有可能把数据库打死,这就是所谓的缓存穿透。

我们在《Redis缓存穿透、缓存击穿和雪崩》中说过,有很多办法可以解决缓存穿透,但我们今天的主角是“布隆过滤器”,“布隆过滤器”就可以解决(缓解)缓存穿透问题。至于为什么说是“缓解”,看下去你就明白了。

2、大量数据,判断某元素是否在其中

现在有大量的数据,而这些数据的大小已经远远超出了服务器的内存,现在再给你一个数据,如何判断给你的数据在不在其中。如果服务器的内存足够大,那么用HashMap是一个不错的解决方案,理论上的时间复杂度可以达到O(1),但是现在数据的大小已经远远超出了服务器的内存,所以无法使用HashMap,这个时候就可以使用“布隆过滤器”来解决这个问题。

二、什么是布隆过滤器

布隆过滤器是一个叫“布隆”的人提出的,它本身是一个很长的二进制向量,既然是二进制的向量,那么显而易见的,存放的不是0,就是1。

现在我们新建一个长度为16的布隆过滤器,默认值都是0,就像下面这样:

将一个元素X怎么加入布隆过滤器?

当一个元素X加入布隆过滤器时,将X作为参数,通过 K 个 Hash 函数将这个元素映射成 k 个值 :K1、K2、K3...,然后把向量中下标为K1、K2、K3...的位置置

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值