bloomfilter算法

bloomfilter:

        对于存在性判断业务,采用Bloomfilter算法,在业务能容忍一定误判的前提下,可以大幅的降低内存占用。

        bloomfilter利用bit数组来表示一个“存在”记录,优化了bitmap用一个bit记录存在误判率过高的问题,bloomfilter采用多个bit位表示记录是否存在,多个bit由相互独立的hash函数生成,如下图,只有多个bit均为1时才表示“存在”(x1,x2,y2),只要有一个bit为0表示“不存在”(y1),两个key可以共用槽位(如x1和x2共用第二个bit)。这种算法存在一定的误判率,可能一个元素虽然不在集合中,由于hash冲突k个bit都可能与其它key冲突,这个冲突概率与数组被置为1的比例相关,写入的key(bit置为1)越多冲突概率越高,理论上整个数组有一半bit位被置为1时,存储与误判处在一个较为理想的平衡点,即空间充分利用的同时误判可控。

        根据不同的业务场景,bloomfilter使用场景也分为两类:

            1. 非精确判断直接当存储用,比如阅读数统计中剔除重复阅读、推荐场景中剔除已经推荐过的Feed;

             2. 精确判断当缓存用,典型架构为bloomfilter + Storage。

        bloomfilter的目的主要挡掉大部分的“不存在”请求,降低请求延时和对storage的压力,比如Feed中大部分是没有赞过,可以使用bloomfilter挡掉不存在的请求;其次在很多存储组件也有大量使用,比如hbase、leveldb以降低对磁盘的空查询。

你可能感兴趣的:(bloomfilter算法)