參考:
背景:
布隆過濾器主要應用在redis快取穿透的場景中(大量查詢不存在的key,redis中不存在,就會將請求打到mysql之類的磁碟儲存裝置中,導致系統崩潰)
快取穿透的解決方法
1.在redis中快取空值,就是將空的key也快取到redis中,但是會占用空間
2.使用布隆過濾器,將全部的有效資料都走一遍布隆過濾器,這樣新來請求時,先走一遍請求的元素是否能通過布隆過濾器的驗證,若未通過就直接放棄請求,若通過再執行查詢
注意:布隆過濾器可能誤判,即使元素通過布隆過濾器的攔截,也可能是無效請求,布隆過濾器只是可以大大降低無效請求的概率
布隆過濾器原理:
原理就是對乙個key進行k個hash演算法獲取k個值,在位元陣列中將這k個值雜湊後設定為1,然後查的時候如果特定的這幾個位置都為1,那麼布隆過濾器判斷該key存在。
布隆過濾器可能會誤判,如果它說不存在那肯定不存在,如果它說存在,那資料有可能實際不存在;
redis的bitmap只支援2^32大小,對應到記憶體也就是512mb,誤判率萬分之一,可以放下2億左右的資料,效能高,空間佔用率極小,省去了大量無效的資料庫連線。
因此我們可以通過布隆過濾器,將redis快取穿透控制在乙個可容範圍內。
例如新聞客戶端的推送去重功能,當推薦系統推薦新聞時會從每個使用者的歷史記錄裡進行篩選,過濾掉那些已經存在的記錄。
實際上,如果歷史記錄儲存在關聯式資料庫裡,去重就需要頻繁地對資料庫進行 exists 查詢,當系統併發量很高時,資料庫是很難扛住壓力的。如果使用快取把歷史記錄都放入快取裡,占用空間太大明顯不現實,這個時候布隆過濾器就登場了,它就是專門用來解決這種去重問題的。它在起到去重的同時,在空間上還能節省 90% 以上,只是稍微有那麼點不精確,也就是有一定的誤判概率。
使用者瀏覽記錄存入資料庫時,會在filter上通過key的hash演算法儲存判斷其是否存在,類似於資料存在資料庫中,判斷該資料是否存在的資訊即元資料存放在bloomfilter中,避免了每次判斷資料是否存在都要去資料庫exist一遍;這樣推送新聞時通過布隆過濾器判斷,推送內容是否已經存在,如果存在則不推送,如果不存在則推送;
布隆過濾器可以準確過濾你已經看過的內容,沒有看過的新內容,可能由於誤判率過濾掉極小的一部分,這樣就可以保證推薦給使用者的都是無重複的。
redis之布隆過濾器
布隆過濾器是什麼?布隆過濾器可以理解為乙個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個物件是否存在時,它可能會誤判。但是布隆過濾器也不是特別不精確,只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率 布隆過濾器基本使用 布隆過濾器有二個基本指令,b...
Redis 布隆過濾器
實現原理 對的資料肯定是對的,錯的資料不能保證是對的。解釋如下 之前新增到容器中的資料,再次進行判斷是不是在這裡面,因為來過,槽位肯定我為1,所以判斷是不會出現問題的。容器中不存在,判斷是不是在容器中,可能其他的資料通過hash函式執行後把槽位占用了,所以存在一定的誤差。不能保證一定沒問題。hash...
Redis 布隆過濾器
想知道某乙個值是不是已經在 hyperloglog 結構裡面了,它就無能為力了,它只提供了 pfadd 和 pfcount 方法,沒有提供 pfcontains 這種方法。講個使用場景,比如我們在使用新聞客戶端看新聞時,它會給我們不停地推薦新的內容,它每次推薦時要去重,去掉那些已經看過的內容。問題來...