set 中會儲存每個元素的內容,而布隆過濾器僅僅儲存元素的指紋。
概念:布隆過濾器可以理解為乙個不怎麼精確的 set 結構,當你判斷某個物件是否存在時,它可能會誤判。(只會誤判那些沒見過的元素)
基本使用:
布隆過濾器有二個基本指令,bf.add 新增元素,bf.exists 查詢元素是否存在,它的用法和 set 集合的 sadd 和 sismember 差不多。注意 bf.add 只能一次新增乙個元素,如果想要一次新增多個,就需要用到 bf.madd 指令。同樣如果需要一次查詢多個元素是否存在,就需要用到 bf.mexists 指令。
127.0.0.1:6379> bf.add codehole user1
(integer) 1
127.0.0.1:6379> bf.exists codehole user1
(integer) 1
127.0.0.1:6379> bf.madd codehole user4 user5 user6
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:6379> bf.mexists codehole user4 user5 user6 user7
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0
設定引數:(影響誤判率)
如果不設定,它在我們第一次 add 的時候自動建立。error_rate是 0.01,預設的initial_size是 100。
bf.reserve有三個引數,分別是 key, error_rate和initial_size。錯誤率越低,需要的空間越大。initial_size引數表示預計放入的元素數量,當實際數量超出這個數值時,誤判率會上公升。
原理:
每個布隆過濾器對應到 redis 的資料結構裡面就是乙個大型的位陣列和幾個不一樣的無偏 hash 函式。所謂無偏就是能夠把元素的 hash 值算得比較均勻。
向布隆過濾器中新增 key 時,會使用多個 hash 函式對 key 進行 hash 算得乙個整數索引值然後對位陣列長度進行取模運算得到乙個位置,每個 hash 函式都會算得乙個不同的位置。再把位陣列的這幾個位置都置為 1 就完成了 add 操作。
向布隆過濾器詢問 key 是否存在時,跟 add 一樣,也會把 hash 的幾個位置都算出來,看看位陣列中這幾個位置是否都為 1,只要有乙個位為 0,那麼說明布隆過濾器中這個 key 不存在。
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...