乐趣区

关于redis:面试时别只说会redis-get-set-布隆过滤器了解下

布隆过滤器是什么

名字就跟每个定律一样,你问为什么叫牛顿定律,因为是牛顿创造或者发现的。「瞪眼」

他能做什么?它是将一个二进制向量和函数映射,布隆过滤器能够用在检测元素是否存在某个汇合或者用于疾速检索中。

毛病: 有肯定的删除问题和谬误识别率

长处:查问工夫和空间都远远超过一般算法

布隆过滤器 Bloom Filter 是怎么实现的

增加 Item 或者元素时,创立一个散列函数和一个 KEY 造成映射,设置的数据 =1,只有检索时判断 = 1 就晓得这个数据存不存在,有了此办法,查问时发现有 0 的则证实肯定不存在,那么反过来讲如果是 1 证实元素很可能存在,

留神这里为什么说很可能存在,因为他有肯定的辨认谬误,但这个谬误在理论生产过程中能够疏忽,毕竟利大于弊么。

看文字晕晕乎乎,不动就画图,来看看应该就会明确许多。

说人话

布隆过滤器到底无能啥?

非凡的 id 暂且不提哈,数据库 id 根本都是自增的对吧!咱们传递 id 后端去 DB 查问,这个十分正当。

然而如果咱们用正数查问呢?一两条无所谓,如果成千上万呢?基本上数据库都会很大压力扛不住,服务器配置暂且不说,拖慢零碎运行速度甚至宕机都是有可能的,这样是不是布隆过滤器的有点有展示的酣畅淋漓。【狗头】

这么吊,也是有代价的,因为它也拿不准,存在肯定水平的判断失误!

问:为什么会误判?

答:搜寻的 key 没在容器中,然而 hash 后失去的 key 都是 1。如果布隆过滤器中有黑名单,那么间接创立一个白名单就搞定了。

问:为什么不容易删除?

答:咱们提到正确的数据 Key 值 =1,但不能因为 = 0 就删掉他,这可能会影响其余元素的判断 不过能够理解下 Counting Bloom Filter「下一篇文章」

说了这么多咋实现

1:预估数量 n 以及冀望的误判率 FPP

2: hash 函数和 bit 汇合的 size 大小

Bit 汇合 Size 大小

函数 哈希抉择,预估值 n 和 bit 数组长度 m 获取 hash 函数 Key

怎么用?maven 我的项目中增加

 <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
 </dependency>    


一段我写的测试代码

/**
 * 布隆过滤器 - 用于 redis 缓存穿透 的状况
 * @author 作者 东南大粽子
 */
public class TestBloomFilterByDZZ {

    private static int total = 19999;
    private static BloomFilter<Integer> bfilter = BloomFilter.create(Funnels.integerFunnel(), total);

  // 初始化数据
    public static void main(String[] args) {for (int i = 0; i < total; i++) {bfilter.put(i);
        }

        // 是否有匹配不上的
        for (int i = 0; i < total; i++) {if (!bfilter.mightContain(i)) {System.out.println("有没关注东南大粽子的 溜了。。。");
            }
        }

        // 不再内的有多少匹配进去
        int count = 0;
        for (int i = total; i < total + 10000; i++) {if (bfilter.mightContain(i)) {count++;}
        }
        System.out.println("炮灰陪跑:" + count);
    }

}

可实用的业务场景

1:当一个入库数据量比拟大的时候,能够用作名称或者惟一件做查看,存在则跳过不存在则入库

2:过滤垃圾邮件,这是一段计算你能够联合本人的业务理解下。

日常求关注,素质一键三连。

每周至多 3 篇原创文章,在被业务折磨的状况下还能留下点什么。

最近很喜爱的一句话“有道无术,术尚可求。有术无道,止于术。”

退出移动版