Redis 中的布隆過濾器

布隆過濾器

布隆過濾器是一個BIT數(shù)組,可以用來判斷一個元素是否在一個集合中已存在。很常用的一個功能是用來去重媒鼓。例如在爬蟲中,我們要爬取的目標網(wǎng)站 URL 千千萬错妖,怎么判斷某個 URL 爬蟲是否已經(jīng)爬取過绿鸣?簡單點可以爬蟲每采集過一個 URL,就把這個 URL 存入數(shù)據(jù)庫中暂氯,每次一個新的 URL 過來就到數(shù)據(jù)庫查詢下是否訪問過潮模。但是隨著爬蟲爬過的 URL 越來越多,每次請求前都要訪問數(shù)據(jù)庫一次痴施,并且對于這種字符串的 SQL 查詢效率并不高再登。除了數(shù)據(jù)庫之外,使用 Redis 的 set 結(jié)構(gòu)也可以滿足這個需求晾剖,并且性能優(yōu)于數(shù)據(jù)庫锉矢。但是 Redis 也存在一個問題:耗費過多的內(nèi)存。相比于數(shù)據(jù)庫和 Redis齿尽,使用布隆過濾器可以很好的避免性能和內(nèi)存占用的問題沽损。

實現(xiàn)原理

布隆過濾器實現(xiàn)非常簡單,如下圖所示循头,在存入元素a绵估、b和c時,分別通過3個hash算法h1()卡骂、h2()和h2()計算出相應的hash值国裳,并將BIT數(shù)組對應位置設(shè)為1。之后在判斷新元素是否已存在時全跨,也只需要使用這3個hash算法h1()缝左、h2()和h2()計算出對應的hash值,然后通過hash值判斷BIT數(shù)組對應位置浓若,如果都為1渺杉,這就能夠說明:d可能存在集合中(因為可能出現(xiàn)hash沖突)。如果有一個為0挪钓,那么說明:d一定不存在集合中是越。所以布隆過濾器對于一個元素是否已存在會存在誤判,但如果某個元素經(jīng)過布隆過濾器判斷不存在碌上,那說明這個元素真的不存在倚评,不會發(fā)生誤判浦徊。

圖片.png

布隆過濾器非常適合那種不需要 100% 準確的、允許存在小概率誤判的大規(guī)模判重場景天梧。除了爬蟲網(wǎng)頁去重這個例子盔性,還有比如統(tǒng)計一個大型網(wǎng)站的每天的 UV 數(shù),也就是每天有多少用戶訪問了網(wǎng)站腿倚,我們就可以使用布隆過濾器纯出,對重復訪問的用戶進行去重。

Redis 中的布隆過濾器

redis 在 4.0 的版本中加入了 module 功能敷燎,布隆過濾器可以通過 module 的形式添加到 redis 中暂筝,所以使用 redis 4.0 以上的版本可以通過加載 module來使用 redis 中的布隆過濾器。但是這不是最簡單的方式硬贯,使用 docker 可以直接在 redis 中體驗布隆過濾器焕襟。

> docker run -d -p 6379:6379 --name bloomfilter redislabs/rebloom
> docker exec -it bloomfilter redis-cli

redis 布隆過濾器主要就兩個命令:

  • bf.add 添加元素到布隆過濾器中:bf.add urls https://jaychen.cc
  • bf.exists 判斷某個元素是否在過濾器中:bf.exists urls https://jaychen.cc饭豹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸵赖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拄衰,更是在濱河造成了極大的恐慌它褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘悉,死亡現(xiàn)場離奇詭異茫打,居然都是意外死亡,警方通過查閱死者的電腦和手機妖混,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門老赤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人制市,你說我怎么就攤上這事抬旺。” “怎么了祥楣?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵开财,是天一觀的道長。 經(jīng)常有香客問我荣堰,道長床未,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任振坚,我火速辦了婚禮,結(jié)果婚禮上斋扰,老公的妹妹穿的比我還像新娘渡八。我一直安慰自己啃洋,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布屎鳍。 她就那樣靜靜地躺著宏娄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逮壁。 梳的紋絲不亂的頭發(fā)上孵坚,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音窥淆,去河邊找鬼卖宠。 笑死,一個胖子當著我的面吹牛忧饭,可吹牛的內(nèi)容都是我干的扛伍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼词裤,長吁一口氣:“原來是場噩夢啊……” “哼刺洒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吼砂,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤逆航,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渔肩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體因俐,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年赖瞒,在試婚紗的時候發(fā)現(xiàn)自己被綠了女揭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡栏饮,死狀恐怖吧兔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袍嬉,我是刑警寧澤境蔼,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站伺通,受9級特大地震影響箍土,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罐监,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一吴藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弓柱,春花似錦沟堡、人聲如沸侧但。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禀横。三九已至,卻和暖如春粥血,著一層夾襖步出監(jiān)牢的瞬間柏锄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工复亏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趾娃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓蜓耻,卻偏偏與公主長得像茫舶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刹淌,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354