日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

布隆过滤器避免redis缓存穿透

發布時間:2024/10/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 布隆过滤器避免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缓存穿透的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。