(1)在沒有引入快取的時候,我們請求的資料都是上資料庫直接查詢了。
(2)引入快取之後,我們在獲取資料時會先去快取看看有沒有快取資料,有直接返回,沒有上資料庫進行查詢,然後設定到快取中,再進行返回。
(3)並不是所有的資料都要放到快取中了:訪問頻率低的、讀少寫多的、一致性要求高的,這些就不要快取了。
快取穿透:使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候就相當於出現了快取穿透。
通俗來講:請求查詢乙個不存在的值,快取中沒有資料,導致請求直接命中資料庫,資料庫中也沒有資料,這就是快取穿透。
快取擊穿:快取中的乙個key(比如乙個**商品),在某個時間點過期的時候,恰好在這個時間點對這個key有大量的併發請求過來,這些請求發現快取過期一般都會從後端db載入資料並回設到快取,這個時候大併發的請求可能會瞬間把後端db壓垮。
通俗的講:請求查詢乙個存在的值(熱點key),快取中有資料,快取中資料的key剛好過期,導致請求直接命中資料庫。(熱點key,快取過期,直擊資料庫)
常見於:秒殺(秒殺中的key就是熱點key。)
乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。
熱點key在高併發下剛好過期,這些秒級請求直接打到資料庫,如果資料庫處理不過來,那就掛了。
我們先理解下雪崩的意思,大量雪體崩塌,這種自然想象就是雪崩。
大量雪對應快取中的就是大量的key,崩塌就是快取過期失效了或者快取層出現了錯誤(掛了),這就造成快取雪崩了,直接請求到資料庫了。
快取雪崩:快取層出現了錯誤(可能是大量的key同一時間失效),不能正常工作了。於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增(大量請求直接命中資料庫),可能會造成儲存層也會掛掉的情況。
ps:擊穿與雪崩的區別即在於擊穿是對於某一特定的熱點資料來說,而雪崩是全部資料。
3.1 理解一
當「無key」的時候,也就是key不存在,這時候頻繁請求,就會越過快取,造成快取穿透。
當「有一key」且很「火熱」的時候,也就是熱點key,這時候頻繁請求,碰巧快取過期了,就會造成快取擊穿。
當「有多key」的時候,也就是說大量的key,在同一時間失效了,歐侯,這時候就都請求到資料庫了,這就會造成快取雪崩了。
3.2 理解二
我們也可以這麼理解,上面快取的三種情況,就是在快取在高併發下的併發問題。
高併發下,不停的訪問乙個不存在的key,造成請求繞過了快取系統,請求落到了資料庫,就造成了快取穿透。
高併發下,不停的訪問乙個熱點key,在快取失效的時候,請求在此時落到了資料庫,就造成了快取擊穿(快取擊穿,本來是有人擋著的,但是利用了快取失效的間隙,進行了攻擊)。
高併發下,大批量快取的key同時失效,此時所有請求落到了資料庫,造成資料庫壓力過大,這就是快取雪崩。
(1)在介面層增加校驗
比如使用者鑑權校驗,引數做校驗,不合法的引數直接**return,比如:id 做基礎校驗,id <=0的直接return。
(2)快取null值
當儲存層不命中後,即使返回的空物件也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源;
但是這種方法會存在三個問題:
快取null的時間太長,null資料長時間得不到更新,會存在快取層和儲存層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響。
快取null的時間太短,達不到防止快取擊穿的效果。
如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵;
(3)布隆過濾器(bloom filter)
類似於雜湊表的一種演算法,用所有可能的查詢條件生成乙個bitmap,在進行資料庫查詢之前會使用這個bitmap進行過濾,如果不在其中則直接過濾,從而減輕資料庫層面的壓力。
(1)設定熱點資料永遠不過期。
(2)使用加互斥鎖:對快取查詢加鎖,如果key不存在,就加鎖,然後查db入快取,然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後返回資料或者進入db查詢。
public(1)redis高可用string get(key)
else
} else
}
這個思想的含義是,既然redis有可能掛掉,那我多增設幾台redis,這樣一台掛掉之後其他的還可以繼續工作,其實就是搭建的集群。
(2)限流降級
這個解決方案的思想是,在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
(3)資料預熱
資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。
在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間(快取資料的過期時間設定隨機),讓快取失效的時間點盡量均勻,防止同一時間大量資料過期現象發生。
設定熱點資料永遠不過期。
快取穿透:查詢乙個不存在的值時,未命中快取,直接落到了資料庫。解決方案:介面校驗、快取null值、bloom filter。
快取擊穿:熱點key,快取過期,直擊資料庫。解決方案:設定永不過期、加鎖互斥獲取資料。
快取雪崩:大量的快取key在同一時間失效,導致大量請求落到資料庫上。解決方案:redis高可用、限流降級、資料預熱(隨機過期時間、設定永不過期)。
在沒有引入快取的時候,我們請求的資料都是上資料庫直接查詢了。
引入快取之後,我們在獲取資料時會先去快取看看有沒有快取資料,有直接返回,沒有上資料庫進行查詢,然後設定到快取中,再進行返回。
並不是所有的資料都要放到快取中了:訪問頻率低的、讀少寫多的、一致性要求高的,這些就不要快取了。
穿透不存在
擊穿熱點key
雪崩快取掛了或者大量key失效
快取穿透 快取擊穿 快取雪崩
一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...
快取穿透,快取擊穿,快取雪崩
所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...
快取穿透快取擊穿快取雪崩
1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...