亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

在爬蟲的過程中如何使用Redis的Bloomfilter去重

2020-03-22 16:49:42
字體:
來源:轉載
供稿:網友

本篇文章給大家帶來的內容是關于如何使用Redis的Bloomfilter去重,既用上了Bloomfilter的海量去重能力,又用上了Redis的可持久化能力,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

前言:

“去重”是日常工作中會經常用到的一項技能,在爬蟲領域更是常用,并且規模一般都比較大。去重需要考慮兩個點:去重的數據量、去重速度。為了保持較快的去重速度,一般選擇在內存中進行去重。

數據量不大時,可以直接放在內存里面進行去重,例如python可以使用set()進行去重。

當去重數據需要持久化時可以使用redis的set數據結構。

當數據量再大一點時,可以用不同的加密算法先將長字符串壓縮成 16/32/40 個字符,再使用上面兩種方法去重;

當數據量達到億(甚至十億、百億)數量級時,內存有限,必須用“位”來去重,才能夠滿足需求。Bloomfilter就是將去重對象映射到幾個內存“位”,通過幾個位的 0/1值來判斷一個對象是否已經存在。

然而Bloomfilter運行在一臺機器的內存上,不方便持久化(機器down掉就什么都沒啦),也不方便分布式爬蟲的統一去重。如果可以在Redis上申請內存進行Bloomfilter,以上兩個問題就都能解決了。

代碼:
# encoding=utf-8import redisfrom hashlib import md5html' target='_blank'>class SimpleHash(object): def __init__(self, cap, seed): self.cap = cap self.seed = seed def hash(self, value): ret = 0 for i in range(len(value)): ret += self.seed * ret + ord(value[i]) return (self.cap - 1) retclass BloomFilter(object): def __init__(self, host= localhost , port=6379, db=0, blockNum=1, key= bloomfilter ): :param host: the host of Redis :param port: the port of Redis :param db: witch db in Redis :param blockNum: one blockNum for about 90,000,000; if you have more strings for filtering, increase it. :param key: the key s name in Redis self.server = redis.Redis(host=host, port=port, db=db) self.bit_size = 1 31 # Redis的String類型最大容量為512M,現使用256M self.seeds = [5, 7, 11, 13, 31, 37, 61] self.key = key self.blockNum = blockNum self.hashfunc = [] for seed in self.seeds: self.hashfunc.append(SimpleHash(self.bit_size, seed)) def isContains(self, str_input): if not str_input: return False m5 = md5() m5.update(str_input) str_input = m5.hexdigest() ret = True name = self.key + str(int(str_input[0:2], 16) % self.blockNum) for f in self.hashfunc: loc = f.hash(str_input) ret = ret self.server.getbit(name, loc) return ret def insert(self, str_input): m5 = md5() m5.update(str_input) str_input = m5.hexdigest() name = self.key + str(int(str_input[0:2], 16) % self.blockNum) for f in self.hashfunc: loc = f.hash(str_input) self.server.setbit(name, loc, 1)if __name__ == __main__ : 第一次運行時會顯示 not exists!,之后再運行會顯示 exists!  bf = BloomFilter() if bf.isContains( http://www.baidu.com ): # 判斷字符串是否存在 print exists!  else: print not exists!  bf.insert( http://www.baidu.com )
說明:

Bloomfilter算法如何使用位去重,這個百度上有很多解釋。簡單點說就是有幾個seeds,現在申請一段內存空間,一個seed可以和字符串哈希映射到這段內存上的一個位,幾個位都為1即表示該字符串已經存在。插入的時候也是,將映射出的幾個位都置為1。

需要提醒一下的是Bloomfilter算法會有漏失概率,即不存在的字符串有一定概率被誤判為已經存在。這個概率的大小與seeds的數量、申請的內存大小、去重對象的數量有關。下面有一張表,m表示內存大?。ǘ嗌賯€位),n表示去重對象的數量,k表示seed的個數。例如我代碼中申請了256M,即1 31(m=2^31,約21.5億),seed設置了7個??磌=7那一列,當漏失率為8.56e-05時,m/n值為23。所以n = 21.5/23 = 0.93(億),表示漏失概率為8.56e-05時,256M內存可滿足0.93億條字符串的去重。同理當漏失率為0.000112時,256M內存可滿足0.98億條字符串的去重。
20161110104702907.png

基于Redis的Bloomfilter去重,其實就是利用了Redis的String數據結構,但Redis一個String最大只能512M,所以如果去重的數據量大,需要申請多個去重塊(代碼中blockNum即表示去重塊的數量)。

代碼中使用了MD5加密壓縮,將字符串壓縮到了32個字符(也可用hashlib.sha1()壓縮成40個字符)。它有兩個作用,一是Bloomfilter對一個很長的字符串哈希映射的時候會出錯,經常誤判為已存在,壓縮后就不再有這個問題;二是壓縮后的字符為 0~f 共16中可能,我截取了前兩個字符,再根據blockNum將字符串指定到不同的去重塊進行去重。

總結:

基于Redis的Bloomfilter去重,既用上了Bloomfilter的海量去重能力,又用上了Redis的可持久化能力,基于Redis也方便分布式機器的去重。在使用的過程中,要預算好待去重的數據量,則根據上面的表,適當地調整seed的數量和blockNum數量(seed越少肯定去重速度越快,但漏失率越大)。

以上就是在爬蟲的過程中如何使用Redis的Bloomfilter去重的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲区中文字幕| 国产97色在线|日韩| 久久精视频免费在线久久完整在线看| 97免费中文视频在线观看| 欧美成人久久久| 国产精品亚洲综合天堂夜夜| 国产精品美女www| 欧美情侣性视频| 日本久久久久久久久| 中文字幕av一区| 精品偷拍各种wc美女嘘嘘| 久久久久久久国产精品视频| 国产精品一区二区三区毛片淫片| 欧美精品在线免费| 亚洲视频在线免费看| 一本色道久久综合亚洲精品小说| 国产色婷婷国产综合在线理论片a| 亚洲色图第三页| 欧美第一淫aaasss性| 国产精品 欧美在线| 日本精品视频网站| 91啪国产在线| 91精品国产91久久久久久久久| 欧美成人精品在线播放| 国产一区二区三区视频免费| 亚洲大胆美女视频| 成人福利视频网| 亚洲天堂网站在线观看视频| 国产欧美一区二区| 日本在线精品视频| 78色国产精品| 欧美国产日本高清在线| 国产三级精品网站| 亚洲免费电影在线观看| 欧美精品一区二区三区国产精品| 久久精品国产精品亚洲| 欧美午夜精品久久久久久人妖| 国产精品99久久99久久久二8| 热re99久久精品国产66热| 欧美成人中文字幕| xxxxx91麻豆| 欧美精品电影免费在线观看| 日本中文字幕久久看| 欧美成人精品不卡视频在线观看| 亚洲美女自拍视频| 色999日韩欧美国产| 久久九九有精品国产23| 国产精品丝袜白浆摸在线| 久久精品影视伊人网| 亚洲精品色婷婷福利天堂| 亚洲欧洲国产一区| 九九热精品视频国产| 国产日韩专区在线| 91精品国产成人| 亚洲永久在线观看| 91国自产精品中文字幕亚洲| 成人黄色片在线| 国产91在线视频| 中文字幕亚洲无线码a| 国产精品女人久久久久久| 日本一区二区不卡| 91精品视频在线免费观看| 欧美成人免费大片| 国产精品久久久亚洲| 17婷婷久久www| 久久精品成人一区二区三区| 亚洲va欧美va在线观看| 97视频在线观看播放| 亚洲综合大片69999| 色哟哟入口国产精品| 欧美在线视频网| 红桃视频成人在线观看| 国产91在线高潮白浆在线观看| 精品视频在线导航| 91高清免费在线观看| 日韩精品视频在线观看免费| 国产在线观看91精品一区| 国产偷亚洲偷欧美偷精品| 97视频在线观看免费高清完整版在线观看| 亚洲成人av中文字幕| 国产日韩欧美在线播放| 久久久国产视频91| 欧美精品激情视频| 欧美乱大交xxxxx| 亚洲a级在线观看| 一本色道久久综合狠狠躁篇的优点| 欧美最猛性xxxxx(亚洲精品)| 国产999精品久久久影片官网| 久久久成人的性感天堂| 国产精品ⅴa在线观看h| 色偷偷av一区二区三区乱| 精品人伦一区二区三区蜜桃免费| 国产成人精品国内自产拍免费看| 永久免费看mv网站入口亚洲| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产亚洲综合久久| 日韩视频免费中文字幕| 亚洲成人av在线| 日本中文字幕成人| 97精品一区二区三区| 日韩电影免费观看中文字幕| 美女av一区二区三区| 狠狠躁夜夜躁人人爽天天天天97| 精品国产一区二区三区四区在线观看| 成人妇女免费播放久久久| 成人444kkkk在线观看| 欧美日韩一二三四五区| 久久久久久尹人网香蕉| 亚洲精品720p| 日韩暖暖在线视频| 俺去了亚洲欧美日韩| 97视频在线观看视频免费视频| 成人性生交大片免费看小说| 日韩av中文字幕在线| 色香阁99久久精品久久久| 精品高清一区二区三区| 亚洲国产精品系列| 日韩国产中文字幕| 久久免费精品日本久久中文字幕| 亚洲美女www午夜| 国模精品系列视频| 精品国产一区二区三区久久| 国产欧美日韩精品在线观看| 亚洲精品电影在线| 欧美国产亚洲视频| 欧美激情免费视频| 日韩av手机在线看| 日韩电影大片中文字幕| 911国产网站尤物在线观看| 97在线看福利| 久久精视频免费在线久久完整在线看| 久久国产精品99国产精| 国产精品网站入口| 精品久久国产精品| 中文亚洲视频在线| 最近2019中文字幕mv免费看| 国产精品十八以下禁看| 亚洲第一区第一页| 亚洲美腿欧美激情另类| 成人在线国产精品| 精品日韩视频在线观看| 亚洲午夜久久久影院| 亚洲精品xxx| 在线观看精品国产视频| 欧美一区第一页| 日韩黄在线观看| 欧美午夜精品久久久久久浪潮| 日本欧美爱爱爱| 亚洲色在线视频| 色婷婷亚洲mv天堂mv在影片| 97国产suv精品一区二区62| 国产日韩在线亚洲字幕中文| 国产精品网站入口| 91亚洲国产成人久久精品网站| 久久久久久久久网站| 国产精品h在线观看| 久热国产精品视频| 亚洲a中文字幕| 亚洲一级片在线看| 欧美电影在线观看完整版| 午夜精品久久久久久99热软件| 亚洲欧洲高清在线| 中文字幕日本精品| 久青草国产97香蕉在线视频|