常見的快取策略

2021-10-04 16:22:10 字數 2360 閱讀 9484

四. 快取的主要問題和解決辦法有哪些?

如果說要對乙個站點或者應用程式進行優化,那麼我們最先想到的優化方式應該是使用快取,使用快取是最快也是效果最明顯的方式。

優點:

1.減輕資料庫壓力(核心)

2.提高使用者體驗

3.增強系統的併發能力

缺點:

1.資料不一致(延遲更新)

2.使用不當容易引發其他問題

1.資料量不是很大

2.訪問頻率高

3.資料不經常更新

一種比較簡單實用的方式,可能是最常用的策略。

1.首先,應用程式先確定資料是否保留在快取中;

2.如果資料在快取中,也即 cache hit (快取命中)。資料直接從快取中讀取並返回給客戶端應用程式;

3.如果資料不在快取中,也即 cache miss(快取未命中)。應用程式會從資料庫中讀取該資料,並將資料儲存在快取中,然後將其返回給客戶端。

4.如果需要要更新某個資料,也是先去更新資料庫中的資料,更新完成之後,則通過指令讓快取cache中的資料失效。

該策略特別適合「讀多」的應用場景。可以在一定程度上抵抗快取故障。如果快取服務發生故障,系統仍然可以通過直接訪問資料庫進行操作。

這種策略並不能保證資料儲存和快取之間的一致性,也會有可能產生髒資料,但是概率很小,屬於極端情況。(假如同時有2個請求a和請求b併發執行。a是首次訪問快取中沒有資料,就會去資料庫中讀資料,讀到了資料準備寫入快取中,在a把資料寫入快取之前,b更新了資料庫,並且設定了快取失效。然後a才開始把資料寫回快取中,那麼最終就會導致,快取中的資料與資料庫的資料不一致,造成了髒資料)通常都是要給快取加上乙個過期的時間,如果必須考慮刪除快取失敗的問題,可以使用訊息佇列實現重試機制(從訊息佇列取出這些key再次進行刪除,失敗再次加入到訊息佇列中,超過一定次數以上則人工介入)–越搞越複雜。

因為首次請求資料需要先把資料載入到快取中,開發人員可以通過手動觸發查詢操作來對資料進行「預熱」。

這個模式其實就是由快取服務完成資料同步的工作。

1.應用要讀資料和更新資料都直接訪問快取服務

2.快取服務同步的將資料更新到資料庫

這個模式出現髒資料的概率就比較低,但是就強依賴快取了,對快取服務的穩定性有較大要求,另外,增加新快取節點時還會有初始狀態空資料問題。

這個模式就是 read/write through 模式 的乙個變種。區別就是 read/write through 模式的快取寫資料庫的時候是同步的,而 write behind 模式 的快取運算元據庫是非同步的。

1.應用要讀資料和更新資料都直接訪問快取服務

2.快取服務非同步的將資料更新到資料庫(通過非同步任務)

這個模式的特點就是速度很快,效率會非常高,但是資料的一致性比較差,還可能會有資料的丟失情況,實現邏輯也較為複雜。

以上就是目前三種主流的快取更新策略,另外還有refrsh-ahead模式等由於使用的不是很常見就不詳細介紹了。

描述:

快取穿透是指使用者請求的資料在快取和資料庫中都不存在。例如惡意攻擊者發起id為「-1」的資料或id為特別大不存在的資料,如果不加以校驗,請求會透過快取直接去訪問資料庫,導致資料庫壓力過大。

解決辦法:

1.id做基礎校驗

2.快取和資料庫都查不到資料時,快取內容為null或者其他預設值,並設定較短的過期時間(根據專案情況合理設定,時間不宜過長)。

3.限流

描述:

快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力

解決辦法:

1.快取預熱。

2.使用互斥鎖(mutex key)

3.讓熱點資料「永不過期」(配合其他策略在專案容錯允許的範圍內保證資料一致,也可通過乙個後台的非同步執行緒進行快取的構建)

4.限流+降級

描述:

快取雪崩是指快取中的大批量key同一時段過期,而該時段內查詢資料量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是,快取擊穿指併發同乙個key。

解決辦法:

1.快取預熱。

2.將快取失效時間分散開(隨機時長+基礎時長)。

3.讓熱點資料「永不過期」(配合其他策略在專案容錯允許的範圍內保證資料一致,也可通過乙個後台的非同步執行緒進行快取的構建)

4.限流+降級

常見快取演算法和快取策略

快取演算法 快取法通過設計良好的資料分塊 預取 順序預取 快取替換等演算法來提高對快取內容的命中率。快取演算法可以分為基於訪問時間的策略 基於訪問頻率的策略 訪問時間與頻率兼顧策略 時間距離分布策略等型別。快取策略 快取策略主要三方面 對於第二方面,大部分快取演算法使用預取策略來提前將部分磁碟資料放...

三種常見的快取過期策略LFU,FIFO,LRU說明

快取實現的過程以及淘汰舊頁面的機制不同,所以會有不同快取排程方法,就常見的就是fifo,lru,lfu快取過期策略。1.fifo first in first out 先見先出,淘汰最先近來的頁面,新進來的頁面最遲被淘汰,完全符合佇列。2.lru least recently used 最近最少使用...

glide的快取策略

本文主要介紹了如何配置和管理glide中的快取,其中大部分內容都可以直接在官方wiki中找到,這裡只是進行了整理和彙總。言歸正傳,glide支援的二級快取 並不是 快取,因為從網路載入並不屬於快取 即記憶體快取和磁碟快取。磁碟快取 一般的快取指的就是磁碟快取,把網路上的快取到本地,這樣就不需要每次都...