簡述:
這個過濾器可以檢索乙個元素是否在乙個集合中(優點是查詢效率很高,缺點是有一定概率出現誤判),可以理解為 利用高效的資料結構和演算法快速判斷出你這個 key 是否在資料庫中存在,不存在就 return ,存在就去查詢 db資料庫 重新整理 kv 再 return。
可以通過**來看下效果:
先導入依賴:
<測試demo:dependency
>
<
groupid
>com.google.gu**a
groupid
>
<
artifactid
>gu**a
artifactid
>
<
version
>20.0
version
>
dependency
>
private輸出結果:static
int size = 1000000;//
預計要插入多少資料,即布隆陣列長度
private
static
double fpp = 0.01;//
期望的誤判率
//private static bloomfilterbloomfilter = bloomfilter.create(funnels.integerfunnel(), size, fpp);
private
static bloomfilterbloomfilter =bloomfilter.create(funnels.integerfunnel(), size);
public
static
void
main(string args)
double count = 0;
for (int i = 1000000; i < 2000000; i++)
}system.out.println("100w條資料,其中總共的誤判數:" + count + "誤判率 :"+ (count/1000000l) * 100 + "%");
//如果增加過濾器雜湊陣列長度為100 0000,則預設誤判率會降低到 0.003%
}
100w條資料,其中總共的誤判數:30155.0誤判率 :3.0155000000000003%可以看到誤判數為3%,原始碼裡有create方法過載,可以看到 有一種方法(我**裡注釋掉的)可以手動傳入期望誤判率,手動設定期望誤差值的話輸出如下:
100w條資料,其中總共的誤判數:10314.0誤判率 :1.0314%
如上圖所示:其預設誤判率在0.03左右。
為什麼會有誤判率?
從布隆過濾器的原理上來講,其本身並不會儲存真正的資料,只是在雜湊陣列中分配標記,例如:
也就是說,其根據對應位置是否為1,判斷資料是否存在,於是就會有個問題,當3和7都佔據這個長度為4的陣列下標處,只會被記錄一次,所以這個資料實際上可能並不存在(對應快取中其實沒有),也就是說,如果布隆返回不存在那就是不存在,而返回存在時可能存在誤判。這個誤判通過增加布隆過濾器雜湊陣列長度可以得到減輕,因為01重複存入的概率會變小。
總結:
布隆過濾器的查詢速度很快,而且保密性強,因為只是儲存二進位制01(不儲存原始資料,可以節省儲存空間),而它的誤判概率並不大,對於零星的漏網之魚落在快取上應該是可以接受的。
Redis 布隆過濾器
實現原理 對的資料肯定是對的,錯的資料不能保證是對的。解釋如下 之前新增到容器中的資料,再次進行判斷是不是在這裡面,因為來過,槽位肯定我為1,所以判斷是不會出現問題的。容器中不存在,判斷是不是在容器中,可能其他的資料通過hash函式執行後把槽位占用了,所以存在一定的誤差。不能保證一定沒問題。hash...
Redis 布隆過濾器
想知道某乙個值是不是已經在 hyperloglog 結構裡面了,它就無能為力了,它只提供了 pfadd 和 pfcount 方法,沒有提供 pfcontains 這種方法。講個使用場景,比如我們在使用新聞客戶端看新聞時,它會給我們不停地推薦新的內容,它每次推薦時要去重,去掉那些已經看過的內容。問題來...
redis 布隆過濾器
為了應對redis快取穿透有三個大致方案 做好引數校驗,快取無效key,以及布隆過濾器。通過布隆過濾器我們可以非常方便地判斷乙個給定資料是否存在於海量資料中。我們需要的就是判斷 key 是否合法 具體是這樣做的 把所有可能存在的請求的值都存放在布隆過濾器中,當使用者請求過來,先判斷使用者發來的請求的...