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

如果每次都查詢一個不存在value的key,由于緩存中沒有資料,是以每次都會去查詢資料庫;當對key查詢的并發請求量很大時,每次都通路DB,很可能對DB造成影響;并且由于緩存不命中,每次都查詢持久層,那麼也失去了緩存的意義。
解決方法:
第一種是緩存層緩存空值
将資料庫中的空值也緩存到緩存層中,這樣查詢該空值就不會再通路DB,而是直接在緩存層通路就行。
但是這樣有個弊端就是緩存太多空值占用了更多的空間,可以通過給緩存層空值設立一個較短的過期時間來解決,例如60s。
第二種是布隆過濾器
将資料庫中所有的查詢條件,放入布隆過濾器中,
當一個查詢請求過來時,先經過布隆過濾器進行查,如果判斷請求查詢值存在,則繼續查;如果判斷請求查詢不存在,直接丢棄。
布隆過濾器方式參考:
布隆過濾器的實作及應用場景