天天看點

【JavaP6大綱】Redis篇:布隆過濾器

布隆過濾器?

需求:

①、原本有10億個号碼,現在又來了10萬個号碼,要快速準确判斷這10萬個号碼是否在10億個号碼庫中?

解決辦法一:将10億個号碼存入資料庫中,進行資料庫查詢,準确性有了,但是速度會比較慢。

解決辦法二:将10億号碼放入記憶體中,比如Redis緩存中,這裡我們算一下占用記憶體大小:10億*8位元組=8GB,通過記憶體查詢,準确性和速度都有了,但是大約8gb的記憶體空間,挺浪費記憶體空間的。

②、接觸過爬蟲的,應該有這麼一個需求,需要爬蟲的網站千千萬萬,對于一個新的網站url,我們如何判斷這個url我們是否已經爬過了?

解決辦法還是上面的兩種,很顯然,都不太好。

③、同理還有垃圾郵箱的過濾

大資料量集合,如何準确快速的判斷某個資料是否在大資料量集合中,并且不占用記憶體。

布隆過濾器:一種資料結構,是由一串很長的二進制向量組成,可以将其看成一個二進制數組。既然是二進制,那麼裡面存放的不是0,就是1,但是初始預設值都是0。

将布隆過濾器看成一個容器,那麼如何向布隆過濾器中添加一個資料呢?數組是從0開始計數的,當要向布隆過濾器中添加一個元素key時,我們通過多個hash函數,算出一個值,然後将這個值所在的方格置為1。

判斷資料是否存在?将這個新的資料通過自定義的幾個哈希函數,分别算出各個值,然後看其對應的地方是否都是1,如果存在一個不是1的情況,那麼我們可以說,該新資料一定不