布隆过滤器避免redis缓存穿透
緩存穿透及布隆過濾器
Redis的基于緩存,極大地提升了應用程序的性能和效率,特別是數據查詢方面,但是也帶來了一些問題,比如典型的
緩存穿透、緩存雪崩、緩存擊穿。
本篇先講緩存穿透及其解決辦法。
(1)緩存穿透(大量查詢一個不存在的key)定義
緩存穿透,是指查詢一個數據庫中不一定存在的數據;
正常使用緩存查詢數據的流程是,依據key去查詢value,數據查詢先進行緩存查詢,如果key不存在或者key已經過期,再對數據庫進行查詢,并把查詢到的對象,放進緩存。如果數據庫查詢對象為空,則不放進緩存。
如果每次都查詢一個不存在value的key,由于緩存中沒有數據,所以每次都會去查詢數據庫;
當對key查詢的并發請求量很大時,每次都訪問DB,很可能對DB造成影響;
并且由于緩存不命中,每次都查詢持久層,那么也失去了緩存的意義。
(2)解決方法
第一種是緩存層緩存空值
將數據庫中的空值也緩存到緩存層中,這樣查詢該空值就不會再訪問DB,而是直接在緩存層訪問就行。
但是這樣有個弊端就是緩存太多空值占用了更多的空間,可以通過給緩存層空值設立一個較短的過期時間來解決,例如60s。
第二種是布隆過濾器
將數據庫中所有的查詢條件,放入布隆過濾器中,
當一個查詢請求過來時,先經過布隆過濾器進行查,如果判斷請求查詢值存在,則繼續查;如果判斷請求查詢不存在,直接丟棄。
ps:布隆過濾器原理
原理就是一個對一個key進行k個hash算法獲取k個值,在比特數組中將這k個值散列后設定為1,然后查的時候如果特定的這幾個位置都為1,那么布隆過濾器判斷該key存在。
布隆過濾器可能會誤判,如果它說不存在那肯定不存在,如果它說存在,那數據有可能實際不存在;
Redis的bitmap只支持2^32大小,對應到內存也就是512MB,誤判率萬分之一,可以放下2億左右的數據,性能高,空間占用率及小,省去了大量無效的數據庫連接。
因此我們可以通過布隆過濾器,將Redis緩存穿透控制在一個可容范圍內。
參考文章:
基于Redis的BloomFilter實戰
層巒疊嶂——redis布隆過濾器
ps:布隆過濾器另一個用途——推薦去重
例如新聞客戶端的推送去重功能,當推薦系統推薦新聞時會從每個用戶的歷史記錄里進行篩選,過濾掉那些已經存在的記錄。
實際上,如果歷史記錄存儲在關系數據庫里,去重就需要頻繁地對數據庫進行 exists 查詢,當系統并發量很高時,數據庫是很難扛住壓力的。如果使用緩存把歷史記錄都放入緩存里,占用空間太大明顯不現實,這個時候布隆過濾器就登場了,它就是專門用來解決這種去重問題的。它在起到去重的同時,在空間上還能節省 90% 以上,只是稍微有那么點不精確,也就是有一定的誤判概率。
用戶瀏覽記錄存入數據庫時,會在Filter上通過key的hash算法存儲判斷其是否存在,類似于數據存在數據庫中,判斷該數據是否存在的信息即元數據存放在BloomFilter中,避免了每次判斷數據是否存在都要去數據庫exist一遍;這樣推送新聞時通過布隆過濾器判斷,推送內容是否已經存在,如果存在則不推送,如果不存在則推送;
布隆過濾器可以準確過濾你已經看過的內容,沒有看過的新內容,可能由于誤判率過濾掉極小的一部分,這樣就可以保證推薦給用戶的都是無重復的。
原文鏈接:https://blog.csdn.net/wx1528159409/article/details/88357728
總結
以上是生活随笔為你收集整理的布隆过滤器避免redis缓存穿透的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch(二)概念及安
- 下一篇: postgresql、mysql数据库v