新聞中心
Cache-Aside模式一種常用的緩存方式,通常是把數(shù)據(jù)從主存儲加載到KV緩存中,加速后續(xù)的訪問。在存在重復(fù)度的場景,Cache-Aside可以提升服務(wù)性能,降低底層存儲的壓力,缺點是緩存和底層存儲會存在不一致。

業(yè)務(wù)場景和面臨問題
在開發(fā)應(yīng)用時,使用緩存被多次訪問的數(shù)據(jù)是常見的操作。但是,緩存和底層存儲的數(shù)據(jù)完全一致是一種不切實際的想法。我們需要一種策略,來保證緩存里的數(shù)據(jù)盡量及時更新,同時也要能夠檢測并應(yīng)對緩存數(shù)據(jù)過期的情況。
解決方案
很多商業(yè)化的緩存訪問提供了 read-throgh 和write-through/write-behind 的操作。這種模式下,讀寫都要先經(jīng)過緩存,操作流程是這樣的:
- 讀取數(shù)據(jù):如果緩存miss,應(yīng)用層就從底層存儲讀取數(shù)據(jù),然后寫入緩存。
- 更新數(shù)據(jù):涉及數(shù)據(jù)修改時,直接修改緩存里的數(shù)據(jù)即可,緩存服務(wù)會自動將修改同步到底層存儲。
如果緩存不提供數(shù)據(jù)同步能力,應(yīng)用層就要負責數(shù)據(jù)在緩存和底層存儲的同步。
使用cache-aside策略,應(yīng)用層能夠模擬read-through緩存的能力。這種策略會要求應(yīng)用層按需把數(shù)據(jù)加載進緩存,下圖給出了存儲數(shù)據(jù)的過程:
如果應(yīng)用層更新了數(shù)據(jù),就可以采用write-through策略。做法也比較簡單:1)修改底層存儲的數(shù)據(jù);2)將緩存里的這條數(shù)據(jù)置為失效(刪除/過期)。
下一次這條數(shù)據(jù)被請求時,使用cache-aside策略:1)應(yīng)用層從底層存儲獲取更新后的數(shù)據(jù);2)寫入緩存。
存在問題和注意事項
在此用這個模式時,需要考慮以下幾點:
緩存數(shù)據(jù)的生命周期。很多緩存實現(xiàn)方案會設(shè)置過期時間,如果數(shù)據(jù)在一段時間內(nèi)沒有被訪問,緩存中置為失效并逐出這條數(shù)據(jù)。為了保證cache-aside模式有效,需要保證緩存失效機制與數(shù)據(jù)的訪問模式是一致的。如果緩存失效時間太短,可能會導(dǎo)致應(yīng)用層反復(fù)從底層存儲獲取數(shù)據(jù)寫入緩存。如果緩存過期時間太長,緩存的數(shù)據(jù)很可能是過期的,與底層存儲不一致。對于半靜態(tài)的數(shù)據(jù)(更新頻次低)或讀取頻繁的數(shù)據(jù)進行緩存,能達到最好的效果。
逐出數(shù)據(jù)。相對于底層存儲,緩存的容量一般是有限的,必須要是需要逐出數(shù)據(jù)。很多緩存采用LRU機制,當然我們也可以自己定制逐出機制。通常為了保證緩存的性價比,所有數(shù)據(jù)都會被配置一個全局的緩存過期屬性。有個別例外的情況,比如從底層存儲中獲取一份數(shù)據(jù)項效率非常低(讀取頻率一般),另一份數(shù)據(jù)項從底層存儲獲取效率高(讀取頻率也高),那么緩存獲取效率低的數(shù)據(jù)收益可能更大。
服務(wù)啟動時填充緩存。一些場景下,服務(wù)啟動時,會把存量數(shù)據(jù)加載到緩存里。這種情況下如果有數(shù)據(jù)過期或被逐出的情況,同樣可以采用cache-aside模式。
數(shù)據(jù)一致性。cache-aside模式并不能保證緩存和底層存儲的數(shù)據(jù)一致性。存儲里的數(shù)據(jù)任何時候都可能被更改,如果是外部服務(wù),緩存可能感知不到數(shù)據(jù)更新。如果一個系統(tǒng)中,多個存儲都存了數(shù)據(jù)的備份,頻繁發(fā)生數(shù)據(jù)同步的情況下,數(shù)據(jù)不一致的情況會更嚴重。
本地緩存,也叫內(nèi)存緩存。數(shù)據(jù)緩存在服務(wù)實例的內(nèi)存中,是有該實例能訪問。如果服務(wù)實例頻繁訪問同樣的數(shù)據(jù),也可以使用Cache-Aside模式。但是本地緩存是允許本服務(wù)實例訪問,不同的服務(wù)實例都在本地內(nèi)存存儲了一份數(shù)據(jù)。不同實例的緩存很快變得不一致,這就需要更頻繁地刷新緩存中的數(shù)據(jù)。在這類場景中,可以考慮使用分片或分布式緩存方案。
應(yīng)用場景
適用場景:
- 緩存并不提供原生的 read-through 或 write-through 的能力。
- 資源需求無法預(yù)估的場景。cache-aside模式允許應(yīng)用按需加載數(shù)據(jù)到緩存,不需要提前對數(shù)據(jù)的需求量進行評估。
不適用場景:
- 緩存數(shù)據(jù)是靜態(tài)的。如果緩存空間能容納這些數(shù)據(jù),可以在服務(wù)啟動時填充緩存,并采用一些策略避免其過期。
- Web農(nóng)場托管的大量Web應(yīng)用,如果Web應(yīng)用支持親和性調(diào)度(client傾向于找上次服務(wù)過的server),client/server之間盡量不要引入額外依賴,比如session信息緩存。
本文題目:服務(wù)存儲設(shè)計模式:Cache-Aside模式
當前URL:http://www.5511xx.com/article/coesdes.html


咨詢
建站咨詢
