如何解決快取失效問題

大雄45發表於2023-02-26
導讀 在如今大資料的時代下,高併發高可用是所有軟體開發都追求的目標,為了實現這一目標,快取的使用是每一個高併發系統都會涉及到的,使用快取可以保障系統的執行效率,提高系統的健壯性。

如何解決快取失效問題如何解決快取失效問題

前言

在高併發的系統架構中,大量網路請求的併發處理,導致資料庫的I/O消耗是非常巨大的,為了快速讀取資料,減少網路請求時延,緩解資料庫的壓力,因此在軟體開發中引入了快取技術。但是在快取的使用過程中也會遇到一些特殊情況導致快取失效,常見的快取失效的情況有三種:快取穿透、快取擊穿、快取雪崩。

快取失效的三種情況

快取(以Redis快取為例)的引入可以減少請求資料庫的次數,提高查詢效率,從而提升系統效能。一般的流程是:應用發起請求後,先查詢快取中是否存在所需資料,如果快取中存在,直接返回資料,如果快取中不存在所需資料,則需要去查詢資料庫,如果資料庫中存在所需資料,則一方面存入快取,另一方面返回查詢結果,如果資料庫中不存在,則返回空或者錯誤。

如何解決快取失效問題如何解決快取失效問題

快取穿透

快取穿透(Cache Penetration)是指查詢一個一定不存在的資料,即使用者訪問的資料既不在快取當中,也不在資料庫中。由於快取中查詢不到資料,請求會去查詢資料庫,然而資料庫中也不存在該資料,也不會寫入快取,導致查詢該資料的時候,每次都要去資料庫中查詢,給資料庫到來壓力。

快取雪崩

快取雪崩(Cache Avalanche)是指大量的快取資料在某一時刻超過了快取的過期時間,同時失效,導致高併發的請求同時去訪問資料庫,造成資料庫壓力過大,導致系統崩潰。這是針對多個快取資料而言的。

快取擊穿

快取擊穿(Cache Breakdown)是指快取過期的一瞬間,有大量的請求去查詢同一個快取資料,由於該資料在承載著大併發,當該資料失效的一瞬間,持續的大併發就會直接去請求資料庫,造成資料庫壓力倍增。這是針對一個快取資料而言的。

解決方案
針對快取穿透的解決方案
  • 第一種方案是採用布隆過濾器進行資料攔截。這也是針對快取擊穿採用的常用方案。在寫入資料時,使用布隆過濾器對資料的key進行標記,當帶有資料key的請求過來後,先用布隆過濾器驗證key是否存在,如果存在,再進入快取或者資料庫中進行查詢。
  • 第二種方案是快取空值。當在資料庫中查詢不到資料時,將其快取為空值或者預設值。此時需要注意,針對其的快取過期時間不宜過長,一般設定為5分鐘內,當資料庫被寫入或者更新該key的新資料時,快取必須同時更新,保證資料的一致性。
  • 針對快取雪崩的解決方案
  • 一般是將key的過期時間後面增加一個隨機數,讓過期時間分散開,使key均勻失效,減少快取時間過期的重複率。
  • 利用加鎖或佇列的方式,保證快取單執行緒寫,但是這種方案會影響併發量,多個請求過來時,只有一個在進行正常的操作,其他請求都會在等待的狀態,影響程式效能,不推薦使用。
  • 使用快取標記,這是比較好的解決辦法。判斷標記是否過期,過期則去資料庫中請求,而快取資料的過期時間要設定的比快取標記長些,如此一來,當一個請求去運算元據庫的時候,其他的請求拿到的是上一次的快取資料。
  • 針對快取擊穿的解決方案
  • 使用互斥鎖,當快取的key過期時,多個請求過來時只允許一個請求去查詢資料庫構建快取,其他請求等待該請求執行完畢之後,重新從快取中獲取資料。
  • 針對訪問量比較大的資料,即熱點資料,不設定快取過期時間,後臺非同步更新快取,適用於不嚴格要求快取一致性的場景。
  • 原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2930908/,如需轉載,請註明出處,否則將追究法律責任。

相關文章