布隆过滤器在python中使用的便利

其实写这个的时候,我都还没有彻底搞懂redis、docker的使用方法,希望有幸看到这篇博客的同学给一点建议!

首先我想谈谈为什么会突然想到redisbloom这个东西。

“爬虫”,获取网页内容的另一个名称,似乎是不是计算机专业的都开始玩这个东西。那在获取内容的过程中,我相信大家应该都会使用requests这个东西吧,requests.get(url,...)来获取一个response对象。近期我在使用时,遇到一个难题,当网站更新以后,我需要重新爬取获得新东西。那么之前爬过的我肯定就不需要了,但如何筛除呢?

就我个人来说,我把之前爬取的数据存为了上一篇博客提到的db文件(数据库文件,利用python中嵌入的sqlite3,但是安全性咱先不谈,后面博客单独说)。所以之后重新爬取时,仅需要和数据库中的数据进行对比就ok了。

按照这个思路,第一次操作时,我每一次判断都把整个数据库读到python里面来。现在想想简直太蠢了,非常地耗时间。之后,我转变了思路,把需要判断的数据用sql读到数据库里面进行匹配,一下快了很多,原因的话我的理解是:第一次操作判断是用的pycharm的引擎,第二次则用的数据库引擎,给pycharm减少了负担。(当然理解有误请大家指出)

随着数据库越装越多,我发现匹配的速度越来越慢。无奈之下只能上网搜搜教程,结果眼前一亮,一个叫过滤器的东西吸引了眼球。生活中我们提到的过滤器,那无非就是过滤掉不需要的东西是吧,这与我们的需求非常相似。

于是就进入博客的主题:布隆过滤器。

什么是布隆过滤器?它是一种概率空间高效的数据结构,特点是高效地插入和查询,用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

至于它的具体原理,推荐大家看一下这几个链接,里面的博主比我讲的详细很多。https://www.cnblogs.com/ysocean/p/12594982.html

https://www.cnblogs.com/caijunchao/p/12993898.html

https://www.cnblogs.com/yscl/p/12003359.html

我概括一下,就是大家都明白哈希函数这个东西,存入的数据,转为ascll码,通过哈希函数算出的值,作为一个数组下标,将其置1。然后ascll码对应的所有数组下标只要有一个不是1,那这个数据就不在里面。但不能说对应所有数组下标都是1这个数据就一定在!原理在上面那些链接里,可能我讲的太抽象了..

话不多说,给大家演示一下操作过程。

首先需要的软件有,pycharm,docker for Windows。

pycharm不说了,直接百度,免费的。

docker的话官网下载。

下载界面:https://www.docker.com/products/docker-desktop

这个是链接。注意我们下的是docker desktop,而且是Windows版。(我是Windows系统,没去搞linux虚拟机)至于那个docker hub应该是跟什么镜像有关的,我还没看完,但是应该对工作很有帮助吧。

详细docker解读:https://www.zhihu.com/question/28300645

安装好后应该是这个样子。

但是你们大概率左下角是红的吧,然后中间写着一个链接fail之类的。关掉软件重启,应该会提示去更新一个叫WSL2的东西。

这个跟着他的教程来就行了,windows官方有免费下载的。刚刚所有的下载都不要翻墙,正常网速下载。

下完应该是这样一个东西。安装结束后,我们可以尝试打开dos窗口(win+R,输入cmd)。

输入docker,如果有以下信息,说明你docker安装成功了。

我看到很多教学视频说的要去找什么阿里云、网易云的镜像啥的,其实我也没搞清楚,只能自己瞎摸索。

大家在用之前还需要会一点简单的docker和redis命令,我发几个链接吧。

docker:https://www.runoob.com/docker/docker-command-manual.html 

 redis:https://m.runoob.com/redis/redis-commands.html

redisbloom:https://github.com/RedisBloom/RedisBloom

接下来我们要在docker上安装redisbloom这个container(容器)。具体操作redisbloom官网给了,在github上,我给大家贴链接,但有时候github打不开,所以我给大家操作一次。

首先在dos窗口输入docker pull redislabs/rebloom:latest,这一步的意思是下载最新的redisbloom。

然后官方给出的是这个命令:docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest

意思是启动这个容器。

但是!!!我强烈推荐,我这个命令:docker run -p 6379:6379 --name redis-redisbloom -d redislabs/rebloom:latest

我在其中加了一个-d,意思是这个启动的命令在后台执行就行了。因为第一次启动容器,如果不加上-d,那当前dos窗口就相当于表示启动状态,不能再继续后续操作(不能再输其他命令),关掉窗口就停止这个容器。加入-d就还可以继续操作。

 

启动后,我们可以使用docker命令查看。docker ps -a

接下来我们需要进入当前路径,docker exec -it redis-redisbloom /bin/bash 

再我们就需要redis命令了。redis-cli

启动redis客户端,连接本地服务器。

终于! !!我们做完了所有工序。现在可以在当前路径下输入redis语句来操作过滤器了。

redisbloom分为四种,布隆过滤器,cuckoo 过滤器等等,我也只学了第一个就只说第一个吧。

几条语句很简单。

1)bf.reserve {key} {error_rate} {size}创建一个空的名为key的布隆过滤器,并设置一个期望的错误率和初始大小。{error_rate}过滤器的错误率在0-1之间,
2)bf.add {key} {item}
     bf.madd {key} {item} [item…]
往过滤器中添加元素。如果key不存在,过滤器会自动创建。

# 上面已经存在的值再次添加会返回0, 不存在则返回1
3)bf.exists {key} {item}

bf.mexists {key} {item} [item…]

判断过滤器中是否存在该元素,不存在返回0,存在返回1。

4)del key 删除叫key的过滤器

其余命令可以在上文链接中学习。

回到我们的python上,刚刚我们是在dos命令中操作布隆过滤器,那既然我上一篇博客都提到了anaconda含有redisbloom包,那么在python环境下肯定也能使用的。

https://github.com/RedisBloom/redisbloom-py

这个链接讲的很详细,各种过滤器都有。我再补充一些。

首先引入redisbloom包后,我们先使用Client()函数,这里是链接到我们的容器。如果没有在括号里输参数,那么默认连接本地的容器,端口号应该是6379。如果你连自己虚拟机上的docker,那就输入虚拟机的ip与端口号。exists()是判断过滤器是否存在的方法,返回值为0则不存在,1为存在。bfCreate()则是创建语句,参数分别是名字,容错率,容量。

接着在适当地方,用bfExists(,)来进行判断。如果为0,则过滤器中不存在这个url地址,再用bfAdd(,)进行添加。

可能没有完整代码大家比较生疏,我由于爬取的是实习时公司任务,所以不方便展示,就给大家重写一下官方的例子。

from redisbloom.client import Client
rb = Client()
rb.bfCreate('bloom', 0.01, 1000)
url1="https://www.baidu.com/?tn=93923645_hao_pg"
url2="https://www.qq.com/"
rb.bfAdd('bloom', url1)        # returns 1
rb.bfAdd('bloom', url1)        # returns 0 上面已存在的值添加会返回0
rb.bfExists('bloom', url1)     # returns 1
rb.bfExists('bloom', url2) # returns 0

基本上操作就结束了。给大家展示一下在过滤器中进行匹配的时间。

从200s到11s,差距很大,你忍一下。~doge

但是有一点我想提出,也不知道算不算缺点吧。添加到过滤器中的数据,是无法删除的,只能在dos窗口使用del删除过滤器或在pycharm里面用 delete('bloom')方法删去,但两者都是直接把过滤器删掉了。

另外大家在用完后要关闭自己的容器啊,这时我就建议大家直接在docker desktop中关闭就行了。

同时以后打开容器也可以在docker desktop中打开,节约时间,方便。

软件默认开机打开,但不会自动启动容器,大家编程前别忘了启动啊。不然就会像下面这样。

最后给大家推荐一个图片,里面有不少命令,方便大家参考。

ps.这一次写了很多,如果有人坚持看到这我非常感激,要是能带去一丝帮助那更是对我莫大的鼓励。其实对于这些技术的学习,我不知道我这样想对不对:大家千万别像我这样,什么技术会一点,跟大家普及都说不清。大家一定要从基础开始看,一步一步学,才能更好的掌握一门技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值