快取穿透 快取擊穿 快取雪崩 熱點資料失效

2021-09-22 12:42:30 字數 2045 閱讀 6405

在我們專案中,多少是會使用快取知識的,因為對於很多資料沒必要每次都到資料庫中進行查詢,如果每次都到資料庫中進行查詢,當出現併發情況時,可能會導致資料庫的宕機。比如一些經常查詢但是又不經常修改的資料,我們可以直接將資料存入快取中,以減少資料庫的壓力。

當然在實現快取的時候,我們也會遇見很多問題,於是彙總一下我們在做專案的時候,常用的一些快取問題,並提供一些解決方案以供參考。

首先我們需要理解在呼叫快取的業務流程是怎樣的?當使用者發起乙個資源的請求,我們首先會到快取中去查詢,如果快取中沒有對應的資料,之後我們再到資料庫中進行查詢(這裡我們可以使用乙個ifelse的判斷),從資料庫中查詢到資料之後,我們要做兩件事:① 將資料返回給使用者 ② 將資料存放在快取內,以便下次使用者再發起資源請求的時候,我們就直接將快取內的資源返回給使用者這樣就避免了再次到資料庫中進行查詢。

但是我們這樣,就可能會出現快取穿透、快取擊穿、快取雪崩等等問題。

何為快取穿透

查詢不存在資料的現象我們稱為快取穿透

正常情況下,我們去查詢資料都是存在。那麼請求去查詢一條壓根資料庫中根本就不存在的資料,也就是快取和資料庫都查詢不到這條資料,但是請求每次都會打到資料庫上面去。

快取穿透所帶來的問題

資料庫宕掉

如果有黑客會對你的系統進行攻擊,拿乙個不存在的id 去查詢資料,會產生大量的請求到資料庫去查詢。可能會導致你的資料庫由於壓力過大而宕掉。

解決方法

快取空值

快取中沒有儲存這些空資料的key。從而導致每次查詢都到資料庫去了。

這些key 設定的值設定為null 丟到快取裡面去。後面再出現查詢這個key 的請求的時候,直接返回null ,就不用在到 資料庫中去走一圈了。最後再設定過期時間。

bloomfilter

bloomfilter 類似於乙個hase set 用來判斷某個元素(key)是否存在於某個集合中

在快取之前在加一層 bloomfilter ,在查詢的時候先去 bloomfilter 去查詢 key 是否存在,如果不存在就直接返回,存在再走查 快取 -> 查 db。

什麼是快取擊穿

在平常高併發的系統中,大量的請求同時查詢乙個 key 時,此時 這個key 正好失效了,就會導致大量的請求都打到資料庫上面去。這種現象我們成為擊穿。例如:秒殺。

快取擊穿會帶來的問題

某一時刻資料庫請求量過大,壓力劇增。

解決方法

使用互斥鎖,鎖住查詢的方法

因為快取擊穿是由多個執行緒同時去查詢資料庫的這條資料,我們直接在第乙個查詢資料的請求上使用互斥鎖鎖住這個方法,其他執行緒就再訪問的時候,就獲取不到鎖,等第乙個執行緒查詢到了資料,然後做快取。

什麼是快取雪崩

當某一時刻發生大規模的快取失效的情況。比如你的快取服務宕機了,會有大量的請求進來直接打到db上面。結果就是db 承受不住,宕掉。

解決辦法

事前:使用集群快取,保證快取服務的高可用

在發生雪崩前對快取集群實現高可用,如果是使用 redis,可以使用 主從+哨兵 ,redis cluster 來避免 redis 全盤崩潰的情況。

事中:使用 ehcache 本地快取 + hystrix 限流&降級 ,避免 mysql ***的情況發生

使用 ehcache 本地快取的目的也是考慮在 redis cluster 完全不可用的時候,ehcache 本地快取還能夠支撐一陣。

使用 hystrix 進行 限流 & 降級 ,比如一秒來了5000個請求,我們可以設定假設只能有一秒 2000 個請求能通過這個元件,那麼其他剩餘的 3000 請求就會走限流邏輯,然後去呼叫我們自己開發的降級元件(降級)。比如設定的一些預設值呀之類的。以此來保護最後的 mysql 不會被大量的請求給打死。

事後:開啟 redis 持久化機制,盡快恢復快取集群

一旦重啟,就能從磁碟上自動載入資料恢復記憶體中的資料。

快取穿透 快取擊穿 快取雪崩

一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...

快取穿透,快取擊穿,快取雪崩

所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...

快取穿透快取擊穿快取雪崩

1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...