天天看點

如何解決redis緩存穿透

何為緩存穿透

正常使用緩存查詢資料的流程是,依據key去查詢value,資料查詢先進行緩存查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,并把查詢到的對象,放進緩存。如果資料庫查詢對象為空,則不放進緩存。

如下圖:

如何解決redis緩存穿透

如果每次都查詢一個不存在value的key,由于緩存中沒有資料,是以每次都會去查詢資料庫;當對key查詢的并發請求量很大時,每次都通路DB,很可能對DB造成影響;并且由于緩存不命中,每次都查詢持久層,那麼也失去了緩存的意義。

解決方法:

第一種是緩存層緩存空值

将資料庫中的空值也緩存到緩存層中,這樣查詢該空值就不會再通路DB,而是直接在緩存層通路就行。

但是這樣有個弊端就是緩存太多空值占用了更多的空間,可以通過給緩存層空值設立一個較短的過期時間來解決,例如60s。

第二種是布隆過濾器

将資料庫中所有的查詢條件,放入布隆過濾器中,

當一個查詢請求過來時,先經過布隆過濾器進行查,如果判斷請求查詢值存在,則繼續查;如果判斷請求查詢不存在,直接丢棄。

如何解決redis緩存穿透

布隆過濾器方式參考:

布隆過濾器的實作及應用場景