緩存筆記(一)--描述

緩存筆記(一)

緩存是通過將頻繁讀取的數據複製到應用程序的快速存儲中,實現提高系統的性能和可伸縮性的技術。

當應用實例重複訪問相同數據時,特別是原始數據源相對較慢受競態條件限制時,或當網絡延遲可能導致訪問速度慢時,緩存最有有效。

緩存類型

常見的緩存有兩種:

  • 內存緩存(In-Memory Caching)。其數據在運行應用實例的計算機本地保存
  • 共享緩存(Shared Caching)。可在不同計算機上運行並可由多個實力訪問的應用程序(如redis)

內存緩存

緩存的最基本類型是內存存儲,存儲在單個進程的地址空間中,並由該進程中運行的代碼直接訪問。內存緩存訪問非常快,並有多種策略來保證存儲少量的靜態數據(緩存大小通常受託管進程的計算機上可用內存限制)。如果使用該模型同時運行的應用程序的多個實例,則每個應用程序實例將擁有自己的獨立緩存,其中包含自己的數據副本。

內存緩存

圖-1 內存緩存模型

內存緩存是數據某個時刻的快照,並不是動態的。在不同實例中保存的數據可能出現版本不同,實例查詢出來的數據也不同

共享緩存

共享緩存通過將緩存放置在單獨的位置(進程、服務器),來確保不同的應用實例訪問相同的緩存數據。不用擔心每個應用實例拿到的緩存數據不同。

共享緩存

圖-2 共享緩存模型

共享緩存提供非常好的延展性,可由單機或者集羣實現。但訪問速度慢於內存緩存。

注意事項

緩存適用於讀多寫少的數據。

數據類型與填充策略

正確使用緩存的關鍵在於確定合適的數據,並在合適的時間對其緩存。通常使用兩種填充策略:

  • 數據在第一次被訪問時寫入緩存。只需要訪問一次底層數據源。
  • 數據在程序啓動時全部(部分)寫入緩存。不建議在大型緩存中使用,啓動時會給底層數據源施加高負載。

填充策略的選擇通常需要使用模式進行分析。

緩存可以處理不可變或者不常變的數據,但對與動態數據不太有用。緩存動態數據,當原始數據變更時,緩存數據會很快過期,保持緩存與原始數據同步的開銷會降低緩存的效率。

緩存中的數據都是臨時的,不要將有價值的數據存儲在緩存中。如緩存不可用,可用最大程度的保證數據不丟失。

直讀(Read-Through)、直寫(Write-Through)和回寫(Write-behind)

  • Read-throug

    當應用系統向緩存服務請求數據時(例如使用key=x向緩存請求數據),如果緩存中並沒有對應的數據存在(key=x的value不存在),緩存服務將向底層數據源的讀取數據。如果數據在緩存中存在(命中key=x),則直接返回緩存中存在的數據。直讀有效地按需緩存數據。

    訪問無效key可能緩存穿透

  • Write-Through

    當應用實例對緩存中的數據進行更新時(例如調用put方法更新或添加條目),緩存系統會同步更新緩存數據和底層數據源。

    Write-Through

    圖-3 直寫流程

  • Write-behind

    當應用系統對緩存中的數據進行更新時(例如調用put方法更新或添加條目),緩存系統會在指定的時間後向底層數據源更新數據。

    Write-behind

    圖-4 回寫流程

通常情況下,直讀直寫模式就能滿足緩存需求。在數據變動頻繁,不需要立即更新數據的情況下,使用回寫更優。如應用實例修改緩存中的數據,並很快再次更新,運用回寫就能避免一次數據源的寫操作,較少數據競爭,提升性能。但如果緩存服務宕機後無法重建,或者系統要求數據變化日誌的,無法使用該模式。

數據過期

通常情況下,緩存都是數據副本。在更新或者數據過期時,緩存數據將被刪除,當應用實例重新查詢是重新寫入緩存。

合理的過期時間設置變得尤爲重要。如果將其設置得太短,則對象將很快過期,從而降低使用緩存的好處,增加數據源讀取。如果將時間段設置得太長,則可能會導致與數據源不同步。

數據長時間保持駐留,可能緩存寫滿,此時需要一個合理的數據淘汰策略,防止程序崩潰。

單數據過期可能緩存擊穿,大量過期可能雪崩

併發管理

緩存通常供多個實例共享讀取和修改其中的數據,也逃不過併發問題。根據數據的性質和衝突的可能性,可以採用兩種併發方法之一:

  • <b>樂觀(Optimistic)</b> 應用程序更新緩存之前要檢查緩存中的數據是否被更新改過。如果數據仍然相同,則可以進行更改。否則,應用程序必須決定是否對其進行更新。此方法適用於不經常更新或不太可能發生衝突的情況。
  • <b>悲觀(Pessimistic)</b> 應用程序在查詢數據時將其鎖定緩存中數據,以防止另一個實例更改數據。此過程可確保不會發生衝突,但會阻止其他需要處理相同數據的實例。悲觀併發會影響解決方案的可伸縮性,並且僅應用於短暫的操作。此方法可能適用於發生衝突的可能性更高的情況,尤其是當應用程序更新緩存中的多個項目,並且必須確保一致性時。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章