布隆过滤器

布隆过滤器

情到浓时终转凉″ 提交于 2020-04-05 18:02:09
参考文章 布隆过滤器redis缓存 https://www.cnblogs.com/zhanggguoqi/p/10571225.html 布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法 http://imhuchao.com/1271.html 借助Redis Bitmap实现简单的布隆过滤器 https://www.jianshu.com/p/c2defe549b40 bloom filter 布隆过滤器介绍 作用: 判断一个元素是否在集合中。 异点: 和java中的collection中的contain有很大的不同,    java中一般都是会,先把元素存储起来,但是布隆过滤器不用存储元素 原理: 每个元素,通过k中不同的hash算法,计算出k个不同的index,把这个index存储位置都设置为1,   (二进制序列的index)    如果一个一个元素计算出所有index上都为1,则存在;一遇到index为0的,元素就不存在。 感觉: 有点好玩,有点不可思议,有点不相信。 特点: 判断不存在的,肯定不存在;判断存在的,可能是误判。   (为什么会误判呢?参考文章中说,二进制序列中1越来越多的时候,就会把不存在的元素,判断成存在)   (那么,我觉得是不是可以,定时重新更新序列呢!从而减少误判情况) 来源: https://www

浅谈布隆过滤器

情到浓时终转凉″ 提交于 2020-03-22 09:55:23
不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。 布隆过滤器的应用 我们先来看下布隆过滤器的应用场景,让大家知道神奇的布隆过滤器到底能做什么。 缓存穿透 我们经常会把一部分数据放在Redis等缓存,比如产品详情。这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。一般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放入缓存,一切看起来很美好。但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么大量的请求都怼到数据库,数据库的压力一下子就上来了,还有可能把数据库打死。 虽然有很多办法都可以解决这问题,但是我们的主角是“布隆过滤器”,没错,“布隆过滤器”就可以解决(缓解)缓存穿透问题。至于为什么说是“缓解”,看下去你就明白了。 大量数据,判断给定的是否在其中 现在有大量的数据

7.【Redis系列】Redis的高级应用-布隆过滤器

前提是你 提交于 2020-03-18 02:27:23
原文: 7.【Redis系列】Redis的高级应用-布隆过滤器 拿今日头条来说,它会不停的给我们推荐新的新闻,每次推荐都要去重,过滤掉我们之前看过的内容,今日头条如何做到去重呢,我们上面的HyperLogLog虽然能去重,但是没有办法确认这个新闻有没有被浏览 过,没有pfcontains的方法。有没有更好的解决方案呢? Redis为我们准备了布隆过滤器,是专门用来解决这种去重问题的,它在起去重功能的同时,空间上还可以节约90%,只是稍微有一定的误判率。 什么是布隆过滤器 布隆过滤器可以理解为稍微不精确的set结构,当你使用他的contains方法判断某个对象是否存在时,它可能会误判,但是布隆过滤器也不是特别的不精准,只要参数设置合理,是可以将误差控制在范围之内的。 当布隆过滤器说某个值存在时,这个值可能不存在,当它说不存在时,那一定是不存在。也就是说当你说认识某个人时,你可能不认识,当你说不认识时,那一定是不认识。套上面的使用场景,布隆过滤器可以精准的过滤掉那些已经看过的内容,那些没有看过的也可能过滤掉一部分,这样就能保证不会给用户推荐已经看过的内容。 Redis的布隆过滤器 布隆过滤器是Redis4.0以插件的形式提供的 基本使用 布隆过滤器有两个基本指令,bf.add添加元素,bf.exists查询元素是否存在,bf.add 一次只能插入一个元素,如果想插入多个,就用到了,bf

哈希&布隆过滤器

巧了我就是萌 提交于 2020-03-07 02:28:18
哈希 1. 设计RandomPool结构 380. 常数时间插入、删除和获取随机元素 题目:设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入。 delete(key):将原本在结构中的某个key移除。 getRandom(): 等概率随机返回结构中的任何一个key。 要求: Insert、delete和getRandom方法的时间复杂度都是 O(1) 思路:使用两个相互对应的HashMap,map的尺寸为size。第一个keyIndexMap存 [key, value] ,第二个IndexKeyMap存 [vlaue, key] 。其中value为该key存入map的次序(从0开始),将其作为索引。 getRandom()方法:使用Math.random() * size,根据size值,等概率地从尺寸为size的map中获取到一个value,从而获取到对应的键值对。 delete(key)方法:修改最后一个键值对,修改后将其覆盖到相应的删除位置,然后删除键值对含“key”的键值对。 package hash ; import java . util . HashMap ; public class Solution_RandomizedSet { public static class RandomizedSet {

算法分析:使用布隆过滤器(Bloom Filter)进行大数据量排序

半世苍凉 提交于 2020-02-29 21:53:27
题目大意:移动公司需要对已经发放的所有139段的号码进行统计排序,已经发放的139号码段的文件都存放在一个文本文件中(原题是放在两个文件中),一个号码一行,现在需要将文件里的所有号码进行排序,并写入到一个新的文件中;号码可能会有很多,最多可能有一亿个不同的号码(所有的139段号码),存入文本文件中大概要占1.2G的空间;JVM最大的内存在300以内,程序要考虑程序的可执行性及效率;只能使用Java标准库,不得使用第三方工具。 这是个典型的大数据量的排序算法问题,首先要考虑空间问题,一下把.2G的数据读入内存是不太可能的,就算把壹亿条数据都转换成INT类型存储也要占接近400M的空间。当时做个题目我并没有想太多的执行效率问题,主要就考虑了空间,而且习惯性的想到合并排序,基本思想是原文件分割成若干个小文件并排序,再将排序好的小文件合并得到最后结果,算法大概如下: 1、顺序读取存放号码文件的中所有号码,并取139之后的八位转换为int类型;每读取号码数满一百万个(这个数据可配置)将已经读取的号码排序并存入新建的临时文件。 2、将所有生成的号码有序的临时文件合并存入结果文件。 这个算法虽然解决了空间问题,但是运行效率极低,由于IO读写操作太多,加上步骤1中的排序的算法(快速排序)本来效率就不高(对于电话排序这种特殊情况来说),导致1亿条数据排序运行3个小时才有结果。

bitmap 和布隆过滤器

随声附和 提交于 2020-02-28 15:56:25
如何解决排重问题: 对于大量的数据,有很多排重方案可以使用,典型的就是 哈希表 。哈希表实际上为 每一个可能出现的数字 提供了一个 一一映射 的关系,每个元素都相当于有了自己的独享的一份空间,这个映射由散列函数来提供(这里我们先不考虑碰撞)。实际上哈希表甚至还能记录每个元素出现的次数,但是用哈希表的话,会占用很多的空间,所以此处不考虑。 做两件事: 集合中每个元素有一个 独享的空间 找到一个到这个空间的 映射方法 Bitmap的好处在于 空间复杂度不随原始集合内元素的个数增加而增加 ,而它的坏处也源于这一点—— 空间复杂度随集合内最大元素增大而线性增大 。 google的guava包中提供了BloomFilter类,新建一个maven工程,引入guava包 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency> bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。 算法: 1. 首先需要k个hash函数

大数据算法——布隆过滤器

狂风中的少年 提交于 2020-02-15 09:49:18
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天的文章和大家一起来学习大数据领域一个经常用到的算法——布隆过滤器。如果看过《数学之美》的同学对它应该并不陌生,它经常用在集合的判断上,在海量数据的场景当中用来快速地判断某个元素在不在一个庞大的集合当中。它的原理不难,但是设计非常巧妙,老实讲在看《数学之美》之前,我也没有听说过这个数据结构,所以这篇文章也是我自己学习的笔记。 原理 在我之前的理解当中,如果想要判断某个元素在不在集合当中,经典的结构应该是平衡树和hash table。但是无论是哪一种方法,都逃不开一点,都需要存储原值。 比如在爬虫场景当中,我们需要记录下之前爬过的网站。我们要将之前的网址全部都存储在容器里,然后在遇到新网站的时候去判断是否已经爬过了。在这个问题当中,我们并不关心之前爬过的网站有哪些,我们只关心现在的网站有没有在之前出现过。也就是说之前出现过什么不重要,现在的有没有出现过才重要。 我们利用平衡树或者是Trie或者是AC自动机等数据结构和算法可以实现高效的查找,但是都离不开存储下所有的字符串。想象一下,一个网址大概上百个字符,大约0.1KB,如果是一亿个网址,就需要10GB了,如果是一百亿一千亿呢?显然这么大的规模就很麻烦了,今天要介绍的布隆过滤器就可以解决这个问题,而且不需要存储下原值,这是一个非常巧妙的做法,让我们一起来看下它的原理。

Reids之缓存雪崩、缓存穿透

与世无争的帅哥 提交于 2020-02-10 14:12:29
1、缓存雪崩 缓存雪崩指的是原有的缓存数据出现了大批量的缓存过期,造成一时间大批量并发请求都到了数据库,造成数据库的压力激增,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。 【解决方案】 从上面的分析可以看出只有当缓存同时大批量过期的时候,才会出现缓存雪崩的情形,所以只要想办法让缓存过期的时间分散开来即可。那方法就多了,比如说将热数据的缓存时间设置长一点,冷数据的过期时间设置得短一点,另外数据也可以分类设置不同的过期时间,或者加一个随机扰乱因子。 2、缓存穿透 缓存穿透是指查询一个不存在于缓存且不存在于数据库的数据,这时如果遭到恶意攻击,频繁地请求这个缺失数据,必然会每次都要读缓存和读数据库,增加了数据库的压力负担。 【解决方案】 对于缺失的数据,每次请求完数据库之后,都要更新到缓存,设置其key对应的value为空即可。这样当下一次请求该缺失数据对应的key,就可以直接通过缓存判断了,不需要再去请求数据库。 ——缺点:显然,当数据缺失很多的时候,必然会极大地浪费缓存的内存空间。 采取bloom filter(布隆过滤器),布隆过滤器的原理如下。 3、布隆过滤器 首先明确我们要解决的问题,即如何快速判断一个数据是否存在于数据库中。那我们自然而然想到的便是采取hash思想,只需要将数据库中的所有数据key存储到一个hash结构中,便可以快速判断

布隆过滤器

偶尔善良 提交于 2020-02-05 10:39:50
布隆过滤器 1、使用场景 2、实现原理 1、使用场景 布隆过滤器用于检查元素是否存在在集合中,比list、set、dict占用空间更少。当以上类型的集合特别大时,以至于无法加载进内存时,布隆过滤器则显得更加有用。天下没有免费的午餐,布隆过滤器是一种概率数据结构,存在一定误报。 2、实现原理 布隆过滤器由以下几个部分组成: n n n 个位组成的数组,每个位的初始值都为 0 0 0 一系列哈希函数 h 1 , h 2 . . . h k h_1,h_2...h_k h 1 ​ , h 2 ​ . . . h k ​ 组成的集合。每个哈希函数都将“键”值映射到上述的 n n n 个桶中(对应于位数组中的 n n n 个位)。 m m m 个键值组成的集合 S S S 。 假设我们将布隆过滤器应用于流数据,我们的目的是让所有键值在 S S S 中的元素通过,而阻挡不在 S S S 中的元素。 位数组的所有初始位为 0 0 0 ,对于 S S S 中的每个键值 K K K ,利用哈希函数进行处理,得到一个哈希值序列 h 1 ( K ) , h 2 ( K ) . . . h k ( K ) h_1(K),h_2(K)...h_k(K) h 1 ​ ( K ) , h 2 ​ ( K ) . . . h k ​ ( K ) ,将这个序列对应的位数组位全部设置为 1 1 1 .

数据结构 - 布隆过滤器(Bloom Filter)

谁都会走 提交于 2020-02-01 22:45:50
思考 如果要经常判断1个元素是否存在,你会怎么做? 很容易想到使用哈希表(HashSet、HashMap),将元素作为key去查找 时间复杂度:O(1),但是空间利用率不高,需要占用比较多的内存资源 如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过? 很显然,HashSet、HashMap并不是非常好的选择 是否存在时间复杂度低、占用内存较少的方案? 布隆过滤器(Boolm Filter) 1970年由布隆提出 它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在 优缺点 优点:空间效率和查询时间都远远超过一般的算法 缺点:有一定的误判率、删除困难 它实质上是一个很长的二进制向量和一系列随机映射函数(Hash函数) 常见应用 网页黑名单系统、垃圾邮件过滤系统、爬虫的网站判重系统、解决缓存穿透问题 原理 假设布隆过滤器由20位二进制、3个哈希函数组成,每个元素经过哈希函数处理都能生成一个索引位置 添加元素:将每一个哈希函数生成的索引位置都设为1 查询元素是否存在 如果一个哈希函数生成的索引位置不为1,就代表不存在(100%准确) 如果一个哈希函数生成的索引位置都为1,就代表存在(存在一定的误判率) 添加、查询的时间复杂度都是:O(k),k是哈希函数的个数。 空间复杂度是:O(m),m是二进制位的个数 误判率