布隆過濾器
簡介
布隆過濾器是一種數據結構。比較巧妙的概率型數據結構,特點是高效的插入和查詢。查詢的結果是:某樣結果是一定不存在,或者是可能存在。
比較:相對與傳統的list,set,map等數據結構,更高效和佔用空間更少,缺點是返回結果是概率性,不確定。
布隆過濾器是一個bit向量或者說是一個bit數組。
不支持刪除
如何選擇哈希值和布隆過濾器長度?
k 爲哈希函數個數,m 爲布隆過濾器長度,n 爲插入的元素個數,p 爲誤報率。
例子
減少磁盤 IO 或者網絡請求
性能很低的哈希函數不是個好選擇,推薦 MurmurHash、Fnv 這些。
大Value拆分
Redis 因其支持 setbit 和 getbit 操作,且純內存性能高等特點,因此天然就可以作爲布隆過濾器來使用。但是布隆過濾器的不當使用極易產生大 Value,增加 Redis 阻塞風險,因此生成環境中建議對體積龐大的布隆過濾器進行拆分。
拆分的形式方法多種多樣,但是本質是不要將 Hash(Key) 之後的請求分散在多個節點的多個小 bitmap (本質是Redis中的string)上,而是應該拆分成多個小 bitmap 之後,對一個 Key 的所有哈希函數都落在這一個小 bitmap 上。
guava實現布隆過濾器
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>