前面在說快取穿透的時候說到解決方案的時候正好有提到布隆過濾器,正好現在就來說一說這個布隆過濾器是怎麼一回事,在說布隆過濾器之前可能需要先說下位圖演算法
位圖(bitmap),又稱柵格圖(英語:raster graphics)或位圖,是使用畫素
布隆過濾器(bloom filter)的核心實現是乙個超大的位陣列和幾個雜湊函式。假設位陣列的長度為m,雜湊函式的個數為k
以上圖為例,具體的操作流程:假設集合裡面有3個元素,雜湊函式的個數為3。首先將位陣列進行初始化,將裡面每個位都設定位0。對於集合裡面的每乙個元素,將元素依次通過3個雜湊函式進行對映,每次對映都會產生乙個雜湊值,這個值對應位陣列上面的乙個點,然後將位陣列對應的位置標記為1。查詢w元素是否存在集合中的時候,同樣的方法將w通過雜湊對映到位陣列上的3個點。如果3個點的其中有乙個點不為1,則可以判斷該元素一定不存在集合中。反之,如果3個點都為1,則該元素可能存在集合中。注意:此處不能判斷該元素是否一定存在集合中,可能存在一定的誤判率。可以從圖中可以看到:假設某個元素通過對映對應下標為4,5,6這3個點。雖然這3個點都為1,但是很明顯這3個點是不同元素經過雜湊得到的位置,因此這種情況說明元素雖然不在集合中,也可能對應的都是1,這是誤判率存在的原因。
布隆過濾器新增元素
布隆過濾器查詢元素
public class bloomfilter ;
/*** 相當於構建 8 個不同的hash演算法
*/private static hashfunction functions = new hashfunction[seeds.length];
/*** 初始化布隆過濾器的 bitmap
*/private static bitset bitset = new bitset(default_size);
/*** 新增資料
** @param value 需要加入的值
*/public static void add(string value) }}
/*** 判斷相應元素是否存在
** @param value 需要判斷的元素
* @return 結果
*/public static boolean contains(string value)
boolean ret = true;
for (hashfunction f : functions)
}return ret;
}/**
* 測試。。。
*/public static void main(string args)
// 新增1億資料
for (int i = 0; i < 100000000; i++)
string id = "123456789";
add(id);
system.out.println(contains(id)); // true
system.out.println(contains("234567890")); //false
system.out.println(contains("100000000")); //false
system.out.println(contains("99999999")); //true
}}class hashfunction
public int hash(string value)
int r = (size - 1) & result;
return r;}}
執行結果
connected to the target vm, address: '127.0.0.1:62256', transport: 'socket'
true
false
false
true
disconnected from the target vm, address: '127.0.0.1:62256', transport: 'socket'
優點:1.查詢時間複雜度 o(k) 乙個較小的常數
2.極度節約空間
3.不儲存資料本身,對源資料有一定保密性
缺點:
1.有一定誤差
2.不能刪除(不同的元素在新增進布隆過濾器時可能會在某些bit位上有相同的點陣圖,刪除某一元素會影響到其他元素,所以無法刪除)
Redis 布隆過濾器
實現原理 對的資料肯定是對的,錯的資料不能保證是對的。解釋如下 之前新增到容器中的資料,再次進行判斷是不是在這裡面,因為來過,槽位肯定我為1,所以判斷是不會出現問題的。容器中不存在,判斷是不是在容器中,可能其他的資料通過hash函式執行後把槽位占用了,所以存在一定的誤差。不能保證一定沒問題。hash...
Redis 布隆過濾器
想知道某乙個值是不是已經在 hyperloglog 結構裡面了,它就無能為力了,它只提供了 pfadd 和 pfcount 方法,沒有提供 pfcontains 這種方法。講個使用場景,比如我們在使用新聞客戶端看新聞時,它會給我們不停地推薦新的內容,它每次推薦時要去重,去掉那些已經看過的內容。問題來...
redis 布隆過濾器
為了應對redis快取穿透有三個大致方案 做好引數校驗,快取無效key,以及布隆過濾器。通過布隆過濾器我們可以非常方便地判斷乙個給定資料是否存在於海量資料中。我們需要的就是判斷 key 是否合法 具體是這樣做的 把所有可能存在的請求的值都存放在布隆過濾器中,當使用者請求過來,先判斷使用者發來的請求的...