基于Redis的布隆过滤器的实现

2023-05-16

项目简介

包含一个基于Redis的布隆过滤器的实现,以及应用到Scrapy中的Demo。

地址:BloomFilterRedis


布隆过滤器

网上有很多介绍,推荐《数学之美》,介绍的很详尽,此处不再赘述。


哈希函数

布隆过滤器中需要n个哈希函数,我使用的是Arash Partow提供的常见哈希函数。


建立在Redis上的布隆过滤器

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

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

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


Reids之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

Scrapy中可以在settings.py中通过DUPEFILTER_CLASS配置过滤器,github上给出了示例工程。


验证

起初的验证策略是:使用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。此验证规模甚小,但笔者近期无具体大
规模去重需求,欢迎有需求或有兴趣的同仁使用并反馈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Redis的布隆过滤器的实现 的相关文章

  • 198个经典C#WinForm实例源码(超赞)

    198个经典C WinForm实例源码 1 窗体 2 控件 3 图像 4 报表 5 系统 6 文件 7 网络 8 数据库 9 加密 解密 10 硬件读写 01 窗体技巧02 控件操作03 图像操作04 报表打印06 系统操作07 文件处理0
  • MySQL8.0.12重置root密码

    在安装完数据库后 xff0c 由于自己不小心直接关闭了安装窗口 xff0c 或者长时间没有使用root用户登录系统 xff0c 导致忘记了root密码 xff0c 这时就需要重置MySQL的root密码 当然 xff0c 最简单方式自然是删
  • 解决方法集合CondaHTTPError:HTTP 000 CONNECTION FAILED for url<https://mirrors.tuna.tsinghua.edu.cn/anaco

    目录 背景 解决方案 主要原因 xff1a 配置没配对 方法A xff1a 在cmd输入 方法B xff1a 修改 condarc xff08 运行期配置文件 xff09 其他原因 原因A xff1a 开了代理或者VPN 原因B xff1a
  • c# TCP通信编程

    目录 协议类JSON协议类XML协议类 通信信息适配 协议类 span class token keyword public span span class token keyword abstract span span class to
  • 【银河麒麟V10】【桌面】ssh连接问题

    1 xshell secureCRT ssh连接V10 2107报 服务器发送了一个意外的数据包 如下 xff1a 解决方式 xff1a 方式1 使用mobaxterm连接无问题 方式2 sudo vim etc ssh sshd conf
  • 【su问题】su: warning: cannot change directory to /home/oracle: Permission denied

    发现问题 su warning cannot change directory to home oracle Permission denied 解决方法 基本上是根目录 或者是 home oracle目录权限的问题 root 64 myo
  • Nginx安装及配置

    Nginx 安装简介 xff1a 有两个版本 Mainline版 包含最新的特性和bug修改 xff0c 并且总是保持更新 可靠 xff0c 但可能会包含实验性的模块 xff0c 以及一定数量的新 bugStable版 不包含新特性 xff
  • HAL库禁用JTAG,使用PB3、PB4、PA15作为普通IO

    void HAL GPIO Init GPIO TypeDef GPIOx GPIO InitTypeDef GPIO Init HAL RCC AFIO CLK ENABLE HAL AFIO REMAP SWJ NOJTAG 禁用JTA
  • 【FreeRTOS 应用开发笔记】FreeRTOS 的启动流程(三)

    在RTOS中 xff0c 常用的启动方式有两种 xff1a 1 在 main 函数中将硬件初始化 xff0c RTOS 系统初始化 xff0c 所有任务的创建这些都弄好 xff0c 这个我称之为万事都已经准备好 最后 启动 RTOS 的调度
  • Ubuntu下使用命令安装配置中文环境

    1 查看当前语言环境 执行 echo LANG 若输出结果为en US UTF 8 xff0c 则表示当前语言环境为英文 2 安装中文语言包 执行命令 xff1a apt get update amp amp apt get install
  • nvm安装详解,nvm控制node npm版本修改(windows环境)

    一 前言 为什么要用 nvm node升到14 2 npm升到6 14后 运行旧配置需求低版本npm项目时候 就会报错 node sass 等等版本不支持的错误 xff0c 类似 xff1a Module build failed Erro
  • Java中a++与++a的理解

    在编程中我们都熟知 a 43 43 和 43 43 a 两者都是原来的值自身 43 1 xff0c 只不过是前者先进行值得使用再 43 1 xff0c 后者先进行 43 1再使用新的值 xff0c 如下 xff1a int a 61 1 i
  • 面试那些事(一)

    最近裸辞了 xff0c 就觉得解脱了好嗨哦 xff01 终于不要再看到领导丑恶的嘴脸 xff01 终于可以不要再逼着加班啦 xff01 终于周末可以好好的睡一觉了 xff01 本来计划的是找好之后再离职 可是发现根本就没时间去准备 xff0
  • 能ping通,不能ssh登录

    宿主机 ping VMware Linux虚拟机能通 xff0c 但是不能ssh登录 当你试了所有方法都不行时 xff0c linux主机网卡改一个IP地址就好了 xff0c 例如10 0 0 1 10 0 0 2 原因是 Linux网卡
  • docker安装软件时出现:报错:E: You don‘t have enough free space in /var/cache/apt/archives/.

    背景 xff1a 在linux系统下安装了一个docker容器 xff0c 拉取一个debian系统后在系统里使用apt get install进行安装文件 问题 xff1a 报错 xff1a E You don 39 t have eno
  • C语言总结

    1 简述C C语言不但执行效率高而且可移植性好 xff0c 可以用来开发应用软件 驱动 操作系统等 2 第一个C程序 include lt stdio h gt int main printf 34 Hello World 34 retur
  • VNC 1.1 窗口大小修改

    编辑vncserver 文件 vi usr bin vncserver 找到 geometry 61 34 1024x768 34 按 i 修改 按 wq 保存 重启vnc服务即可 PS 不会重启只能一一kill 掉 vncserver k
  • 《Java核心技术》卷1——学习笔记(1)

    第三章的基本语法 1 类名命名规范为骆驼命名法 xff0c 即首字母大写 2 源代码为 java文件 xff0c 编译后字节码文件为 class 控制台先用javac name java命令编译源文件 xff0c 然后用java name运
  • Ubuntu 18.04 install docker-ce(community)

    Ubuntu 18 04 install docker ce community 1 Older versions of Docker were called docker docker io or docker engine If the
  • 三维模型特征提取方法概述

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 作者I 开拓者5号 64 CSDN 编辑I 3D视觉开发者社区 一 三维特征提取概述 三维特征提取是模式识别中最基本的研究内容之一 xff0c 可以有效地缓解模式识别领域经

随机推荐