精华内容
下载资源
问答
  • 布隆过滤器使用场景

    2019-12-04 08:20:15
    判断给定数据是否存在:比如判断一个数字是否在包含大量数字的数字集中、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单...添加元素到位数组(布隆过滤器)的...
    1. 判断给定数据是否存在:比如判断一个数字是否在包含大量数字的数字集中、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等;

    2. 去重:比如爬给定网址的时候对已经爬取过的 URL 去重。

    下面,我们再来看看如果想要手动实现一个的话,那么需要以下几步:

    1. 合适大小的位数组保存数据
    2. 几个不同的哈希函数
    3. 添加元素到位数组(布隆过滤器)的方法实现
    4. 判断给定元素是否存在于位数组(布隆过滤器)的方法实现。
    展开全文
  • 布隆过滤器的概念这里就不赘述了 参考链接 如何在海量元素中(例如 10 亿无序、不定长、不重复)快速判断一个元素是否存在? 很简单嘛, 把所有的数据都添加到数据结构里去, 如list或map等, get判断不就完了嘛. ...

    布隆过滤器应用场景有很多, 搜索框: 如用户按特点关键词搜索, 避免缓存穿透等等

     不良用户利用搜索框或者涉及到缓存的应用场景,拿一些乱七八糟的key来查询,这时候redis和数据库这种值都是不存在的,人家每次拿的key也不一样,你就算缓存了也没用,(缓存没有的数据就会去查数据库), 这时候数据库的压力是相当大, 怎么办呢,这时候我们今天的主角布隆过滤器就登场了。。

    布隆过滤器的概念这里就不赘述了

    参考链接

    首先引入一道面试题: 如何在海量元素中(例如 10 亿无序、不定长、不重复)快速判断一个元素是否存在

    很简单嘛, 把所有的数据都添加到数据结构里去, 如list或map等, get判断不就完了嘛. emmm... 面试官可能会问这么简单的问题吗?

    数据量小的话, 完全可以的, 那么上亿上百亿呢?

    引入一个节省空间的数据结构: 位图他是一个有序的数组,只有两个值,0 和 1。0代表不存在,1代表存在。

    如何确定某一元素在哪个位置是0还是1, 怎么解决这个问题呢,那就要用到哈希函数,用哈希函数有两个好处,第一是哈希函数无论输入值的长度是多少,得到的输出值长度是固定的,第二是他的分布是均匀的(map中定义元素的位置也是这种形式),如果全挤的一块去那还怎么区分,比如MD5、SHA-1这些就是常见的哈希算法。

    我们通过哈希函数计算以后就可以到相应的位置去找是否存在了,我们看红色的线,24和147经过哈希函数得到的哈希值是一样的,我们把这种情况叫做哈希冲突或者哈希碰撞。哈希碰撞是不可避免的,我们能做的就是降低哈希碰撞的概率,第一种是可以扩大维数组的长度或者说位图容量,因为我们的函数是分布均匀的,所以位图容量越大,在同一个位置发生哈希碰撞的概率就越小。但是越大的位图容量,意味着越多的内存消耗,所以我们想想能不能通过其他的方式来解决,第二种方式就是经过多几个哈希函数的计算,你想啊,24和147现在经过一次计算就碰撞了,那我经过5次,10次,100次计算还能碰撞的话那真的是缘分了,你们可以在一起了,但也不是越多次哈希函数计算越好,因为这样很快就会填满位图,而且计算也是需要消耗时间,所以我们需要在时间和空间上寻求一个平衡。。

    为什么会使用它

    相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的.

    Java代码中使用布隆过滤器 google为我们已经提供了相关家暴

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>25.1-jre</version>
    </dependency>

     简单模拟

        private static int size = 1000000; // 元素的个数
        private static double fpp = 0.05; //默认误判率 不设置默认是0.03
        private static BloomFilter<String> BF = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), size, fpp);
    
        public static void main(String[] args) {
            for (int i = 0; i < size; i++) {
                BF.put("dugt" + i);
            }
    
            if (!BF.mightContain("dugt8866")) {
                System.out.println("没有");
                return; // 没有直接返回
            }
    
            System.out.println("有");
            //todo 业务逻辑
        }
    

    运行结果 

    从元素的角度来说:

    • 如果元素实际存在,布隆过滤器一定判断存在

    • 如果元素实际不存在,布隆过滤器可能判断存在 (这点误判 相比大量的无意垃圾请求 可以容忍的 )

    展开全文
  • 布隆过滤器其实就是将目标数据经过布隆大哥自己写的hash算法, 这个算法是将 将一个8位比特位1的数据 也就是8个1(这个是比特位的1)(数量根据需要的成功率会有变化), 然后将每个比特位通过他的算法对应到一个长度位64k...

    布隆过滤器其实就是将目标数据经过布隆大哥自己写的hash算法,
    这个算法是将
    将一个8位比特位1的数据 也就是8个1(这个是比特位的1)(数量根据需要的成功率会有变化),
    然后将每个比特位通过他的算法对应到一个长度位64k的二进制数组上(长度也随成功率自行调整) ,
    例如
    https://google.com/abc/d
    通过布隆过滤器时
    可以计算出8个位置
    1 2 3 9 15 20 31 32(仅举例)
    那么我们就将8个比特位分别插入到这些位置

    11111111

    如果下次存在经过这个过滤器的时候, 8个比特位完全重复的, 那么大概率是已经通过一次这个过滤器了, 大概率不代表完全确定, 因为可能存在偶然结果, 但是我们可以通过适当增大二进制数组的长度, 来确保尽量可靠

    Hbase之所以会用到这个布隆过滤器是因为, region server 的内存在很多情况下会自动将内存中的热数据写入到文件中, 时间一长会造成一个region目录/一个列族目录下存在多个文件, 而且这些个文件可能存在重复数据, 让我们查询数据的时候, 显然盲目遍历的去查找是不科学的, Hbase就选择在写入每个文件时, 同时通过了布隆过滤器, 也就是每个文件都有一个布隆过滤器的二进制数组, 所以当Hbase查询数据时, 它会去选择读取结果全部命中布隆过滤器二进制数组的对应的文件, 这样虽然不能保证100%, 但是最坏的结果也就是多读了几个文件, 相比遍历, 效率显著提高!

    在这里插入图片描述

    展开全文
  • 文章目录布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter1、布隆过滤器的起源,用途2、布隆过滤器的概念3、布隆过滤器的优缺点1、优点2、缺点4、应用场景5、布隆过滤器的工作原理6、布隆过滤器的设计 ...

    布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter


    1、布隆过滤器的起源,用途

    布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

    2、布隆过滤器的概念

    如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

    Hash面临的问题就是冲突。假设Hash函数是良好的,如果我们的位阵列长度为m个点,那么如果我们想将冲突率降低到例如 1%, 这个散列表就只能容纳m / 100个元素。显然这就不叫空间效率了(Space-efficient)了。解决方法也简单,就是使用多个Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,不过直觉上判断这种事情的概率是比较低的。

    3、布隆过滤器的优缺点

    1、优点

    相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

    布隆过滤器可以表示全集,其它任何数据结构都不能。

    2、缺点

    但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣。

    另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

    在降低误算率方面,有不少工作,使得出现了很多布隆过滤器的变种。

    4、应用场景

    • 网页URL 去重
    • 垃圾邮件识别
    • 黑名单
    • 查询加速【比如基于KV结构的数据】
    • 集合元素重复的判断
    • 缓存穿透

    5、布隆过滤器的工作原理

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

    新建一个16位的布隆过滤器,如图
    在这里插入图片描述

    有一个对象,我们通过

    • 方式一计算他的hash值,得到hash = 2
    • 方式二计算他的hash值,得到hash = 9
    • 方式三计算他的hash值,得到hash = 5

    通过三个方法计算得到三个数值,我们把这三个数值对应的布隆过滤器向量值改为1,表明该位置有值。

    第二个对象,加入得到值1 6 3,就把1 6 3 改为1

    对于布隆过滤器本身来说,并没有存储任何数据,只是计算该数据的位置,然后存储向量值

    那么,如果需要判断某个数据是否存在于布隆过滤器,就只需要判断计算出来的所有向量值是否都为1即可


    但是:

    当存储的数据向量不断增多,就可能会出现,2 9 5 向量值都为1,但是实际上没有这个数据的情况,这样就导致了,布隆过滤器只能判断某个数据一定不存在,但是不能保证某个数据一定存在。

    另外,因为一个向量位置可能被多个对象映射,所以,布隆过滤器无法删除数据

    6、布隆过滤器的设计

    布隆过滤器思路比较简单,但是对于布隆过滤器的随机映射函数设计,需要计算几次,向量长度设置为多少比较合适,这个才是需要认真讨论的。

    如果向量长度太短,会导致误判率直线上升。
    如果向量太长,会浪费大量内存。
    如果计算次数过多,会占用计算资源,且很容易很快就把过滤器填满。

    展开全文
  • 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和...很多的使用都是利用布隆过滤器一定不存在的这个特性来进行的。 HashMap当然这
  • 布隆过滤器使用场景4.通过 Java 编程手动实现布隆过滤器5.利用Google开源的 Guava中自带的布隆过滤器6.Redis 中的布隆过滤器6.1介绍6.2使用Docker安装6.3常用命令一览6.4实际使用 海量数据处理以及缓存穿透这两个...
  • 大话布隆过滤器及其应用场景

    千次阅读 2020-03-31 21:50:25
    今天看博客,有这么一篇文章,他以一道面试题引出了布隆过滤器的概念。这道题大致意思是这样的:假设现在有1000瓶水,其中有一瓶有毒,只要喝一滴,过30天就会毒发身亡。问最少需要多少只小白鼠可以找到有毒的那瓶水...
  • 布隆过滤器

    2020-01-07 11:43:10
    海量数据处理以及缓存穿透这两个场景让我认识了布隆过滤器 ,我查阅了一些资料来了解它,但是很多现成资料并不满足我的需求,所以就决定自己总结一篇关于... 布隆过滤器使用场景。 通过 Java 编程手动实现布...
  • 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,...
  • https://blog.csdn.net/wx1528159409/article/details/88357728
  • 1.什么是布隆过滤器 百度的概念:布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和...
  • 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,...
  • 海量数据处理以及缓存穿透这两个场景让我认识了 布隆过滤器 ,我查阅了一些资料来了解它,但是很多现成资料并不满足我的需求,所以就决定... 布隆过滤器使用场景。 通过 Java 编程手动实现布隆过滤器。 利用Goog...
  • 一、什么是布隆过滤器布隆过滤器可以用来判断一个元素是否在一个集合中。它的优势是只需要占用很小的内存空间以及有着高效的查询效率。 对于布隆过滤器而言,它的本质是一个位数组:位数组就是数组的每个元素都...
  • 理解布隆过滤器使用场景

    千次阅读 2020-03-15 09:53:59
    简单来说,可以把布隆过滤器看作一个【位数组】,这个数组里面存入的都是0或者1。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200315095034920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5...
  • 布隆过滤器简介 布隆过滤器(Bloom Filter)是由布隆( Burton Howard Bloom )在 1970 年提出的。它由一个很长的二进制向量 (位向量) 和一系列随机均匀分布的散列 (哈希) 函数组成。用多个散列函数,将每个数据映射...
  • 1、布隆过滤器是什么?(判断某个key一定不存在) 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 特点是高效地插入和查询,可以用来告诉你 ...1. 布隆过滤器在NoSQL数据库领域中应用的非常广泛 2. ...
  • 这就可以实现出上述的去重功能,如果你的服务器内存足够大的话,那么使用 HashMap 可能是一个不错的解决方案,理论上时间复杂度可以达到 O(1 的级别,但是当数据量起来之后,还是只能考虑布隆过滤器。 解决缓存...
  • 十一:redis之布隆过滤器使用应用场景 什么是布隆过滤器 我们会遇到一些场景,判断元素是否在集合中。 我们可以采用的方案有set。我们来看这两个方案的优缺点 如果我们使用set来进行判断元素是否在集合中,那么...
  • 布隆过滤器(Bloom Filter)实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率...
  • 布隆过滤器解读

    2021-02-02 10:32:15
    布隆过滤器使用场景。 通过 Java 编程手动实现布隆过滤器。 利用Google开源的Guava中自带的布隆过滤器。 Redis 中的布隆过滤器。 1.什么是布隆过滤器? 首先,我们需要了解布隆过滤器的概念。 布隆过滤器(Bloom ...
  • 转至博主地址:Google布隆过滤器与Redis布隆过滤器详解 一、什么是布隆过滤器布隆过滤器可以用来判断一个元素是否在一个集合中。它的优势是只需要占用很小的内存空间以及有着高效的查询效率。 对于布隆过滤器而言...
  • 如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1。 例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7,则上图转变...
  • 用Java实现布隆过滤器

    千次阅读 2020-05-11 15:47:03
    布隆过滤器使用场景4.用Java 实现布隆过滤器 1.什么是布隆过滤器布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。 实际上可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,307
精华内容 4,122
关键字:

布隆过滤器应用场景