原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11632622.html
背景
比如刷抖音的時候,抖音會不停的推薦新的內容,而它每次推薦時候都要去重,以去掉那些我們已經看過的內容,問題是抖音是如何實現推送去重的?
Bloom Filter方案
Bloom Filter就是專門用來解決這種去重問題的。它在起到去重作用的同時,在空間上還能節省90%以上,但是稍微有點不精確,有一定的誤判概率。
可以把布隆過濾器理解成一個不怎么精確的set結構,當使用它的contains方案判斷某個對象是否存在時,它可能會誤判。但是布隆過濾器也不是特別不精確,只要參數設置的合理,它的精確度也可以控制的相對足夠精確,只會有小小的誤判概率。
Redis官方提供的布隆過濾器到了Redis4.0提供了插件功能之后才正式登場。布隆過濾器作為一個插件加載到Redis Server中,給Redis提供了強大的布隆去重功能。
兩個基本指令
bf.add
bf.exists
空間占用統計
https://krisives.github.io/bloom-calculator/
布隆過濾器的其他應用
- 爬蟲系統,對URL進行去重,已經爬過的網頁就可以不用再爬了,可以大幅降低去重存儲消耗。
- NoSQL數據庫中例如HBase,使用布隆過濾器可以顯著降低數據庫的IO請求量。當用戶來查詢某個row時,可以先通過內存中的布隆過濾器過濾掉大量不存在的row請求,然后再去磁盤進行查詢。
- 郵箱系統的垃圾郵件過濾功能也普遍用到來布隆過濾器,當然也會有某些正常的郵件被放進垃圾郵件目錄中,誤判所致,概率比較低。