四. 快取的主要問題和解決辦法有哪些?
如果說要對乙個站點或者應用程式進行優化,那麼我們最先想到的優化方式應該是使用快取,使用快取是最快也是效果最明顯的方式。
優點:
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支援的二級快取 並不是 快取,因為從網路載入並不屬於快取 即記憶體快取和磁碟快取。磁碟快取 一般的快取指的就是磁碟快取,把網路上的快取到本地,這樣就不需要每次都...