簡介
布隆過濾器(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
主要是針對不存在的,進行短路操做,避免無效的查詢安全