16.Redis布隆过滤器实现

一、布隆过滤器原理

1、布隆过滤器概念

布隆过滤器(Bloom Filter)由Howard Bloom在1970年提出的一种概率型数据结构,它由一个二进制(0或1)向量和一系列随机映射函数组成,其初始化后值为0。当布隆过滤器做保存操作时,并不会真正的存储该值,只会将该值HashCode对应标志位的0修改为1。

优点:

  • 节约存储空间  由于布隆过滤器不会真正的存储Key,任何Key布隆过滤器只需要使用1bit的存储空间。比如:1亿个UUID存储,布隆过滤器只需要11.9M的存储空间。
  • 查询速度快  由于布隆过滤器的算法是hash算法,其时间复杂度为O(1)。

缺点:

  • 无法删除  由于布隆过滤器不存真正的Key无法根据Key去修改布隆过滤器中的标示位,这点也不是绝对的只是大部分的布隆过滤器实现准守这个规则,完全可以自定义布隆过滤器实现删除效果。
  • 存在误差  由于布隆过滤器是基于Hash算法通过计算标示位的方式判断Key是否存在,理论上存在Hash碰撞,所以布隆过滤器天然的存在误差。是不是有误差就代表有问题呢?其实也不是这样的,我们需要研究误差的原因和如何规避这个误差,下文会讨论如何规避布隆过滤器的误差。 理论上:MySql的事务也不是理论真正的事务在极端情况下事务也是靠不住的。

2、布隆过滤器设计原理

上面介绍了布隆过滤器的特性,下面介绍下布隆过滤器的原理。下文分别从存储、路由、理论容量、出错概率、扩容、删除等等方面介绍布隆过滤器。

2.1、计算机的最小存储单位

由于0、1是最小的计算机识别单位,其占用的存储空间就是1bit,也是计算机的最小存储单位,所以布隆过滤器选择位作为最小的存储单位是最节约空间的。存储单位计算器

2.2、IP4是32位的对布隆过滤器算法影响猜想

  为什么计算机很多产品的最大容量都和2^{32}有关系,比如:java Integer.MAX_VALUE、比如hash最大容量、比如es最大容量。除掉这个数足够大、容量、性能等,我个人猜想是和IP4协议有关系,IP是一个32位长度2进制,当初设计这个范围就是想包括世界所有的计算机,目前没有找到文献证明。

2.3、布隆过滤器的理论容量

    目前市面上布隆过滤器的内部扩容后的值大概在Integer.MAX_VALUE内,我们需要容量乘上一个x系数(一般是几百倍),所以布隆过滤器容量是 max =Integer.MAX_VALUE/x。当我们初始化过大时会爆异常。

2.4、布隆过滤器误判计算

下面推算布隆过滤器的出错率,m表示布隆过滤器数组的大小,k操作次数,n表示布隆过滤器已经插入的个数。

布隆过滤器算法推导
布隆过滤器操作布隆过滤器某位为1概率布隆过滤器某位为0概率
一次操作布隆过滤器值被修改的概率\frac{1}{m}1-\frac{1}{m}
k次操作后布隆过滤器值被修改的概率1-(1-\frac{1}{m})^{^{k}}(1-\frac{1}{m})^{^{k}}
布隆过滤器有n个元素,k次操作后布隆过滤器值被修改的概率1-(1-\frac{1}{m})^{^{kn}}(1-\frac{1}{m})^{^{kn}}

当Hash碰撞,k次不在集合里面的元素被误判在集合中的概率

【布隆过滤器有n个元素,k次操作后布隆过滤器值被修改的概率】

(1-(1-\frac{1}{m})^{^{kn}})^{^{k}}1-(1-(1-\frac{1}{m})^{^{kn}})^{^{k}}

布隆过滤器重复概率计算:待验证元素个数是m=10000, 经过布隆过滤器扩容系数p=700,最终得到M=m*p=700*10000,一天累计的业务n=100,当在次操作k=2.此时布隆过滤器重复的大约概率p=1/100000*1/100000大概是亿亿分之一,由于计算器范围原因,采用一个近视数。

 

二、布隆过滤器使用

1、布隆过滤器使用场景

  • 去重场景  比如:爬虫网页去重、头条给用户推荐信息去重、在线考试系统去掉已经做过的题、垃圾邮箱判定
  • 缓存击穿  比如:对没有缓存覆盖的db发大量的请求击穿缓存导致db宕机,可以用布隆过滤器提前判断db是否有数据,否则直接拒绝。

2、实现布隆过滤器的产品介绍

  • Redis  

        最大支持数据:Integer.MAX_VALUE*2 元素去重复

  • google guava   

         最大支持数据: Integer.MAX_VALUE个元素去重复   

         扩容系数算法:(long) (-n * Math.log(p) / (Math.log(2) * Math.log(2)));   n:取重复数  p:容忍错误率      

         Guava推荐最优推荐:optimalM(1000, 0.0000000000000001) = 76680 which is less than 10kb. Who cares

 

3、布隆过滤器扩容与降低误判

  • 不能扩容    布隆过滤器初始化后大小固定了不能扩容。由于布隆过滤器存储的值占容量比例越大,其出错的概率就越大,所以我们在生产中可以自己实现扩容。比如按照日期分不同的布隆过滤器,然后删除失效的布隆过滤器等策略。    
  • 降低误判    由布隆过滤器误判公式推倒,布隆过滤器存储值与容量比越大,其误判概率就越大。所以我们可以不断的降低布隆过滤器的无效的历史数据达到降低误判的效果。    

4、Google Guava布隆过滤器源码解析

   待更新

5、布隆过滤器实现重复验证框架

    swan

文章产考:

           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值