添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
逼格高的课本  ·  Catch prediction in ...·  4 月前    · 
踢足球的遥控器  ·  selenium三种等待_ntil·  1 年前    · 
发财的蛋挞  ·  justauth-spring-boot-s ...·  1 年前    · 
霸气的大葱  ·  使用 ldapmodify 和 ...·  2 年前    · 

建立在Redis上的布隆过滤器

Redis中有一个数据结构叫做Bitmap(下方有官网详解),它提供一个最大长度为512MB(2^32)的位数组。我们可以把它提供给布隆过滤器做位数组。

根据《数学之美》中给出的数据,在使用8个哈希函数的情况下,512MB大小的位数组在误报率万分之五的情况下可以对约两亿的url去重。而若单纯的使用set()去重的话,以一个url64个字节记,两亿url约需要128GB的内存空间,不敢想象。

我使用的策略是使用哈希函数算出的哈希值对2^32取模,填入bitmap中。

以下内容翻译自官网 http://www.redis.cn/topics/data-types-intro.html#bitmaps
英语水平有限,有些地方选择了意译,大佬路过还请不吝赐教,先行谢过~

Bitmap不是一个确切的数据类型,而是基于String类型定义的一系列面向位操作的方法。因为String是二进制安全的并且它们的最大长度是512MB,
所以String类型很合适去作为一个2^32长度的位数组。

位操作方法可以被分为两组:一、对单一位的操作,比如设置某一位为1或0,或者得到这一位的值;二、对一组位的操作,比方说计算一定范围内的1的个数(比如计数)
bitmap一个最大的优势是它通常能在存储信息的时候节省大量空间。比方说一个用增量ID来辨别用户的系统,可以用仅仅512MB的空间来标识40亿个用户是否想要接受通知。

使用SETBIT和GETBIT命令来对位进行置数和检索:

> setbit key 10 1
(integer) 1
> getbit key 10
(integer) 1
> getbit key 11
(integer) 0

SETBIT 如上所示,意思是将第10位置位为1,第二个参数可为0或1。如果设置的位超出了当前String的长度,那么会自动增长。(最长2^32,下同)
GETBIT 如上所示,返回第10位和第11位的数据,分别是1和0。如果查找的位超出了当前String的长度,那么会返回0。

接下来是三个对一组位进行操作的命令:
BITOP 执行不同字符串之间的逐位操作。所提供的操作有AND,OR,XOR和NOT。BITCOUNT
BITCOUNT 计数,返回bitmap里值为1的位的个数.
BITPOS 返回第一个0或1的位置
BITPOS和BITCOUNT不仅可以作用于整个bitmap,还可以作用于一定的范围,下面是一个BITCOUNT的例子:

> setbit key 0 1
(integer) 0
> setbit key 100 1
(integer) 0
> bitcount key
(integer) 2

应用实例略……

起初的验证策略是:使用scrapy框架从一个百度百科页面出发,提取页面内其它百科词条的链接,在过滤器内将过滤掉的url记录在本地文件
filted.txt 中,将正确请求的到的结果存入mongoDB。

在起初测试时发现 filted.txt 中记录的过滤掉的url中百分之九十九都不在mongoDB内,注意到已过滤掉约1万条url,而mongoDB中仅有300条,
使用 bitcount key 命令查看redis中的bitmap中的值为1的位的个数,发现有约10万。而mongoDB中的300条数据至多置位300*8=2400位,显
然哪里出了问题。经分析,这是因为大量经过过滤器的请求尚存在于scrapy的请求队列中,未被发出,所以mongoDB里也不会有相应记录。

所以为了验证布隆过滤器的可靠性,在过滤器过滤前将所有的url都存入 allurl.txt 文件,等文件内url达到一定规模后,与 filted.txt 进行
相应处理——编写脚本计算误报率。经验证,在对百度百科约70万条url进行处理后,过滤约40万条,误判量为0。此验证规模甚小,但笔者近期无具体大
规模去重需求,欢迎有需求或有兴趣的同仁使用并反馈。

布隆算法是一个以牺牲一定的准确率来换取低内存消耗的过滤算法,可以实现大量数据的过滤、去重等操作。 本博客不讨论布隆算法的具体原理,如果想了解的可以查看这篇博客:布隆过滤器(Bloom Filter)... 来自: Alex_zmx的博客 一、什么是缓存击穿 查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。缓存击穿是黑客攻击系统的常用手段。 二、怎么解决缓存击穿问... 来自: 小范的博客 Redis 空间压缩--布隆过滤器对名单处理redis一、布隆过滤器知识分享:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.ht... 来自: qq_41961113的博客 之前就阅读过数学之美,知道有这么个强大的工具,可是因为不常用到也就没当回事,最近重新看到它觉得很高大上,就想来mark下设计初衷: (Bloom Filter)是由布隆(Burton Howard ... 来自: GNU'S Not Unix Redis中有一个数据结构叫做Bitmap(下方有官网详解),它提供一个最大长度为512MB(2^32)的位数组。我们可以把它提供给布隆过滤器做位数组。 根据《数学之美》中给出的数据,在使用... 来自: 小菜鸟的博客 BloomFilter(大数据去重)+Redis(持久化)策略背景之前在重构一套文章爬虫系统时,其中有块逻辑是根据文章标题去重,原先去重的方式是,插入文章之前检查待插入文章的标题是否在ElasticS... 来自: 只有那些疯狂到认为自己可以改变世界的人,才可以真的改变世界 今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 “布隆过滤器原理都不懂,还要我优化?”。技术菜被人怼认了、怪不得别人,自己之前确实... 来自: 旧时光 | YoungChen's 博客 离线数据处理与实时数据处理有很大的不同,其中一个例子就是去重。在聚数据中,访问UV和购买UV都需要实时的去重。离线处理的时候,我们可以通过count(groupby)或者count(distinct)... 来自: 飞飞好奇的专栏 Python3+Windows的环境,使用布隆过滤器确实不是一个很明智的选择,因为要么现成的模块不支持Windows平台,要么就是只支持Python2,要么就是对文件操作的支持不理想。经过不懈努力,找... 来自: 小小的客栈 大大的江湖 布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤... 来自: l1258914199的专栏 讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的? 你会想到服务器记录了用户看... 来自: C18298182575的博客 在看了Spring入门经典的3.4章结尾,教我们使用注解的方式代替xml配置SpringMVC。在练习这一部分代码的时候,最直接的感悟就是, 注解其实就是配置文件的另一种编码形式,能够代替xml实现... 来自: qq_16979575的博客 Bloom Filter是一个占用空间很小、效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成。可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1)。 在很多场景... 来自: tianyaleixiaowu的专栏 在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个 集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是... 来自: 享受技术带来的快乐 参考文献: https://my.oschina.net/kiwivip/blog/133498 https://blog.csdn.net/jiaomeng/article/details/... 来自: 2lovecode blog 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也... 来自: YiCun_的博客 这不是一篇搭建教程,因为用Redis实现布隆过滤器很简单,Redis本身就支持bitmap这种数据结构,通过setbit和getbit即可实现一个Bloom Filter。本文要讨论的是测试过程中,或... 来自: NEWCIH的博客 布隆过滤器(Bloom Filter): 是由布隆(Burton Howard Bloom)提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器用于检索一个元素是否在一个集合... 来自: mi_rencontre的博客 5TB的硬盘上放满了数据,请写一个算法将这些数据进行排重。如果这些数据是一些32bit大小的数据该如何解决?如果是64bit的呢? 在面试时遇到的问题,问题的解决方案十分典型,但对于海量数据处理接触少... 来自: zdxiq000的专栏 一、增量爬取的思路:即保存上一次状态,本次抓取时与上次比对,如果不在上次的状态中,便视为增量,保存下来。对于scrapy来说,上一次的状态是抓取的特征数据和上次爬取的 request队列(url列表)... 来自: zcc_0015的专栏 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速... 来自: wu_tian_hao的博客 布隆过滤去重 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来... 来自: zhaobig的博客 布隆过滤器是由一个很长的二进制向量和一系列随机映射函数组成。它可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误判。 布隆过滤器的原理:底层使用... 来自: Better_JH的博客 下午-开会-对需求-通过友好的交流,得知,我们需要实现一个系统,系统需要实现一个API,用于检查一条特定的数据是否在数据库中,数据库中数据量暂且估计3000万条,API调用量每秒2万次,需求可... 来自: whodarewin2005的专栏 最近写爬虫需要降低内存的占用,现在用的是HashSet进行已爬URL的过滤,所以想到用布隆过滤器(Bloom Filter)来替换,从而减少内存的开销。因为HashSet内部是由HashMap处理的,... 来自: JavaSheng的专栏 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表、树等等数据结构都是这种思路,但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越... 来自: liru_1996的博客 引言之前数据采集时有2个需求就是url去重与数据的增量爬去(只能够请求增加的url,不然会增加被爬网站的服务器负荷),最开始的想法是指用redis的set实现url去重,但在后面开发中无意的解决了增量... 来自: fengxueersui的博客 1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别、文本翻译、序列预测、中文分词等多个领域。虽然近年来,由于RNN等深度学习方法的发展,HMM模型... 来自: tostq的专栏 Axure RP 8.0 注册码仅供个人学习交流使用(建议购买正版授权)8.1.0.3366亲测可用 Licensee:University of Science and Technology o... 来自: 前端大白兔的博客 最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案。因此我就在这里做一个demo,供大家相互学习。html5开发越来越流行了,而对于视频这一块也是必不可少的一部分。如... 来自: xmt1139057136的专栏 翻译: selfimprE-mail: lgg860911@yahoo.com.cnBlog: http://blog.csdn.net/lgg201转载请声明出处: http://blog.csd... 来自: goosman-lei 上篇文章讲述了机器学习决策树的原理,以及如何选择最优特征作为分类特征。本篇文章将在此基础上进行介绍。主要内容包括:决策树构建、决策树可视化、使用决策树进行分类预测、决策树的存储和读取、sklearn实... 来自: Jack-Cui 大早晨的调着调着程序,视线没离开一会,就发现jlink自动断开连接了,然后重新拔插jlink、重启都不行,才发现小灯已经不亮了,原来是固件损坏了,果断想办法修复这位大爷。以前修复过这个问题,但当时系统... 来自: 紫藤的专栏 人脸识别之特征脸方法(Eigenface)zouxy09@qq.comhttp://blog.csdn.net/zouxy09       因为需要,花了一点时间写了下经典的基于特征脸(EigenFa... 来自: zouxy09的专栏 Assimp是目前比较全的3D格式解析库了,熟悉3D游戏开发的同行都知道,3D的格式非常混乱,各种3D格式在不同场合都有他们特定的应用,游戏引擎只能够解析少部分3D格式,更多实用的格式来自游戏公司自定... 来自: 开发游戏,辉煌全中国 问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统... 来自: 开发随笔 0、前提安装elasticsearch的最新版本,目前是2.3.4版本。 elsticsearch新增扮演的角色是:rally分析结果会存储到elasticsearch。1、运行esrally 高级... 来自: 铭毅天下 一、为什么选择RocketMQ 我们来看看官方回答: “我们研究发现,对于ActiveMQ而言,随着越来越多的使用queues和topics,其IO成为了瓶颈。某些情况下,消费者缓慢(消费能力不足)还... 来自: jayjjb的专栏