快取那些事之常見問題與解決方案

2021-10-05 07:35:30 字數 1100 閱讀 3953

快取應該是技術人員最常見的乙個詞了,但是或許不是所有人都能準確的說出快取本質是什麼,又適用於什麼情況,可能遇到哪些問題,應該怎麼來解決。下面我就分三篇文章來給大家詳細介紹下快取相關的知識。疏漏不足之處,也請指正,不勝感激。

《快取那些事之初識快取》

《快取那些事之快取更新、失效以及記憶體淘汰策略》

《快取那些事之常見問題與解決方案》

快取確實有千般好,可以有效提高我們系統的效能,但是同時也會帶來一些問題,如果沒有好好處理這些問題,就會給系統帶來很多不可控的因素,下面我們來了解下快取系統常見的問題以及如何來解決。

快取穿透是指使用者查詢的資料在資料庫中不存在,這時候自然不會更新到快取系統中,因此,每次查詢這個不存在的資料的時候,我們都需要去資料庫去查詢,這也就失去了快取的意義。另外黑客也可能利用這一點來進行攻擊,例如頻繁使用不存在的key(如非常大的id)來查詢我們的應用,這就可能會導致資料庫由於壓力過大而宕掉。

解決方案

快取雪崩是指因為某些原因,導致快取在某乙個時間內大規模失效,例如設定了同乙個過期時間,或者快取服務宕機了,這時候就會有大量的請求直接到資料庫上面,資料庫瞬時壓力過重而掛了。

快取服務宕機的情況我們這裡先不討論,這個主要是服務的高可用和服務降級的問題。我們來看看另一種情況如何來解決。

解決方案

加鎖寫快取:快取過期時,系統先獲取鎖,獲取成功的才允許讀資料庫,並寫入快取,其他請求就都返回稍後重試或者直接sleep一小段時間然後重試原有邏輯。

提前過期:設定快取的時候,在快取的資料裡加多乙個字段,表示提前過期時間,這個過期時間比快取真正過期的時間短。然後讀快取的時候,如果發現快取裡的提前過期時間到了,就去獲取鎖,獲取到的請求讀資料庫,並寫入快取,同時更新提前過期時間和快取過期時間,而其他沒有獲取到鎖的請求就按讀到的快取資料正常往後面走邏輯,不再負責更新快取。

快取擊穿和快取雪崩很像,快取雪崩是同一時間大量快取過期,導致資料庫壓力過大宕機了,而快取擊穿是指某乙個熱點key過期了,而這時候這個kye又有大量請求過來,就會給資料庫帶來巨大壓力,導致資料庫宕機。快取擊穿的解決方案可以採取快取雪崩的後兩個方案,這裡就不贅述了。

enjoy it !

如果覺得文章對你有用,可以贊助我喝杯咖啡~

快取常見問題及解決方案

使用快取可以緩解大流量壓力,顯著提高程式的效能。我們在使用快取系統時,尤其是大併發情況下,經常會遇到一些 疑難雜症 本文總結了一些使用快取時常見的問題及解決方案,以後在遇到這類問題時可以作為參考,在設計快取系統的時候也應該考慮這些常見的情況。為了表述方便,本文以資料庫查詢快取為例,使用快取可以減小對...

redis快取常見問題及解決方案

快取雪崩 當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓 力。導致系統崩潰。解決方案 在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個線 程查詢資料和寫快取,其他執行緒等待。做二級快取,a1為原始快取,a2為拷貝...

Redis快取常見問題及解決方案

可以簡單的理解為 系統剛剛部署完畢,所有快取資料還未準備完畢或者由於原有快取有效期集體到達 例如 系統中所有快取都設定的一致的過期時間,在同一時刻出現大面積的快取過期,所以原本應該查詢快取的請求都去查詢資料庫了,造成資料庫壓力驟增,甚至宕機.使用加鎖或者佇列的方式保證不會有大量執行緒對資料庫進行一次...