[学习交流] 基于Redis的布隆过滤器的实现

Posted 黑马程序员成都中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[学习交流] 基于Redis的布隆过滤器的实现相关的知识,希望对你有一定的参考价值。

                -----  黑马成都开班时间-----


       java34期基础班2020.2.10     
        java35期基础班2020.3.3       
        java36期基础班2020.3.25
        UI3期基础班:2020.2.12             
        前端8期基础班:2020.3.15
         python4期基础班2020.3.15

        


项目简介        

包含一个基于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] 纯文本查看 复制代码

?

(c)2006-2024 SYSTEM All Rights Reserved IT常识