布隆過濾器

       Bloom Filter 其實是一個很長的二進制矢量和一系列隨機映射函數。他能夠用來判斷一個元素是否在一個集合中。他的優點是隻佔用很小的內存空間以及有着高效的查詢效率。數據庫

      對於布隆顧慮器而言,它的本質是一個位數組,位數組的每個元素都是隻佔一bit,並且元素只能是0或者1。一開始,布隆過濾器的位數組全部位初始化都是0.好比,數組長度爲m,那麼長度爲m的數組全部的位都初始化爲0.數據中的每位都是二進制位。網頁爬蟲

      布隆過濾器除了一個數組,還有K個哈希函數。當一個元素加入布隆過濾的時候,會進行以下操做:數組

      1.使用K個哈希函數對元素進行K次計算,獲得K個哈希值。緩存

      2.根據獲得的哈希值,在位數組中把對應的下表值的值置位1.服務器

      當判斷一個值是否在布隆過濾器中,對元素進行k次哈希計算,獲得值以後判斷位數組中每一個元素是否都爲1,若是值都爲1,那麼說明這個值在布隆過濾器中,若是存在一個值不爲1,說明該元素不在布隆過濾器中。函數

         布隆過濾的一個缺陷:存在誤判。內存

        很顯然,數組的容量再大,也是有限的。當隨着元素的增長,插入元素機會愈來愈多,位數組爲1的位置所以也愈來愈多,就會形成一個不在布隆過濾器中在元素,進過一樣規則的哈希計算以後,獲得的值在位數組中查詢,有可能這個位置由於以前其餘元素的操做都爲1了。it

        補救方法:效率

        布隆過濾器存在必定的誤識別率,常見的補救方法是創建白名單,存儲那些可能被誤判的元素。二進制

         使用場景:

         1.網頁爬蟲對URL的去重,避免爬取相同的URL地址。

         2.進行垃圾郵件過濾:反垃圾郵件,從數十億的垃圾郵件列表中判斷某郵箱是否垃圾郵箱。

         3.有的黑客爲了讓服務宕機,他們會構建大量不存在於緩存中的key,向服務器發起請求,在數據量足夠大的狀況下,頻繁的數據庫查詢可能致使DB掛掉。布隆過濾器很好的解決了緩存擊穿的問題。

相關文章
相關標籤/搜索