[学习交流] 基于Redis的布隆过滤器的实现
Posted 黑马程序员成都中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[学习交流] 基于Redis的布隆过滤器的实现相关的知识,希望对你有一定的参考价值。
----- 黑马成都开班时间-----
项目简介
包含一个基于Redis的布隆过滤器的实现,以及应用到爬虫中scrapy框架中的Demo中。
布隆过滤器
网上有很多介绍,推荐《数学之美》,介绍的很详尽,此处不再阐述哈希函数
布隆过滤器中需要n个哈希函数,我使用的是Arash Partow提供的常见哈希函数
建立在Redis上的布隆过滤器
Redis中有一个数据结构叫做Bitmap(在下方有官网详解),它提供一个最大长度为512MB(2^32)的位数组。我们可以把它提供给布隆过滤器做位数组。
根据《数学之美》中给出的数据,在使用8个哈希函数的情况下,512MB大小的位数组咋误报率万分之五的情况下可以对约两亿的url去重。而若单纯的使用set()去重的话,以一个url64个字节记,两亿url约需要128GB的内存空间,不敢想象。
我使用的策略是使用哈希函数算出哈希值对2^32取模,填入bitmap中。
Redis之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和GITBIT命令来对位进行置数和检索
[Shell] 纯文本查看 复制代码
?
1
以上是关于[学习交流] 基于Redis的布隆过滤器的实现的主要内容,如果未能解决你的问题,请参考以下文章 |