布隆過濾器-使用場景的思考

聚變歸來發表於2020-06-14

簡介

布隆過濾器(Bloom Filter)由布隆於 1970 年提出,它實際上由一個很長的二進位制向量和一系列隨機對映函式組成。布隆過濾器可以用於查詢一個元素是否在一個集合中,它的優點是空間和時間效率都遠超一般的演算法,缺點是會有一定的誤判和刪除困難。

工作中遇到的問題

es插入時,我們需要制定id,而制定了id就需要查詢,導致讀取的壓力很大,而且會存在重複插入的場景(id一致,其他也一致,多餘的操作)

考慮的幾種改造方案:
方案1:插入es前,新增快取,若存在則不進行多餘的es插入
方案2:插入es前,使用boomfilter,理論上空間比方案1更加小

然而方案2,存在了漏資料的風險,這是我們無法接受的,故排除方案2

網上關於錯誤率是否可以接受的一些例子:

很多時候這個錯誤率我們是能接受的

  • 譬如垃圾郵箱問題,是壞人一定會被抓,這個能保證。無非是一些好人也被抓,這個可以通過給這些可伶的被誤傷的設定個白名單就OK。
  • 至於爬蟲Url重複這個就更沒問題了,會缺掉一些網頁而已。
  • 至於在快取穿透上的應用,是為了避免惡意使用者頻繁請求快取中不存在DB也不存在的值,會導致快取失效、DB負載過大,可以使用BloomFilter把所有資料放到bit陣列中,當使用者請求時存在的值肯定能放行,部分不存在的值也會被放行,絕大部分會被攔截,這些少量漏網之魚對於DB的影響就會比大量穿透好的多了。

技術方案中 使用布隆過濾器-的案例:

  • Google 的分散式資料庫 Bigtable 使用了布隆過濾器來查詢不存在的行或列,以減少磁碟查詢的IO次數。
  • Squid 網頁代理快取伺服器在 cache digests 中使用了也布隆過濾器。
  • Venti 文件儲存系統也採用布隆過濾器來檢測先前儲存的資料。
  • SPIN 模型檢測器也使用布隆過濾器在大規模驗證問題時跟蹤可達狀態空間。
  • Google Chrome瀏覽器使用了布隆過濾器加速安全瀏覽服務。
  • Google Guava - 使用bloom過濾器判斷是否存在該行(rows)或(colums),以減少對磁碟的訪問,提高資料庫的訪問效能
  • Apache的HBase - 使用bloom過濾器判斷是否存在該行(rows)或(colums),以減少對磁碟的訪問,提高資料庫的訪問效能
  • Apache_Cassandra - 使用bloom過濾器判斷是否存在該行(rows)或(colums),以減少對磁碟的訪問,提高資料庫的訪問效能
  • 比特幣 - 使用布隆過濾判斷錢包是否同步OK

主要是針對不存在的,進行短路操作,避免無效的查詢

相關文章