基於redis 實現布隆過濾器

2021-08-28 23:52:46 字數 883 閱讀 7607

redis中有乙個資料結構叫做bitmap(下方有官網詳解),它提供乙個最大長度為512mb(2^32)的位陣列。我們可以把它提供給布隆過濾器做位陣列。

根據《數學之美》中給出的資料,在使用8個雜湊函式的情況下,512mb大小的位陣列在誤報率萬分之五的情況下可以對約兩億的url去重。而若單純的使用set()去重的話,以乙個url64個位元組記,兩億url約需要128gb的記憶體空間,不敢想象。

我使用的策略是使用雜湊函式算出的雜湊值對2^32取模,填入bitmap中。

/*

* 模擬專案啟動時候 從"資料庫"或者其他地方獲取到的過濾器集合的資料

*/static listl = new arraylist();

// 模擬生成的訂單號/使用者/商品id

static

/*** 單機版測試

*/@test

public void testredis() );

// 判斷指定值是否在過濾器裡面

string orderid = l.get(0);

//string orderid = "201810120005";

long index = math.abs((long) (orderid.hashcode() % size));

boolean contain = jedis.getbit("orderid", index);

// 為true 說明在裡面

執行結果 orderid如果在l集合裡面 就顯示包含,否則就不包含

Redis 布隆過濾器

實現原理 對的資料肯定是對的,錯的資料不能保證是對的。解釋如下 之前新增到容器中的資料,再次進行判斷是不是在這裡面,因為來過,槽位肯定我為1,所以判斷是不會出現問題的。容器中不存在,判斷是不是在容器中,可能其他的資料通過hash函式執行後把槽位占用了,所以存在一定的誤差。不能保證一定沒問題。hash...

Redis 布隆過濾器

想知道某乙個值是不是已經在 hyperloglog 結構裡面了,它就無能為力了,它只提供了 pfadd 和 pfcount 方法,沒有提供 pfcontains 這種方法。講個使用場景,比如我們在使用新聞客戶端看新聞時,它會給我們不停地推薦新的內容,它每次推薦時要去重,去掉那些已經看過的內容。問題來...

redis 布隆過濾器

為了應對redis快取穿透有三個大致方案 做好引數校驗,快取無效key,以及布隆過濾器。通過布隆過濾器我們可以非常方便地判斷乙個給定資料是否存在於海量資料中。我們需要的就是判斷 key 是否合法 具體是這樣做的 把所有可能存在的請求的值都存放在布隆過濾器中,當使用者請求過來,先判斷使用者發來的請求的...