緩存模式,把數據從源數據加載到緩存中,可以改善服務的性能,同時儘量確保緩存與源數據的一致性。
背景
爲了提高服務性能,我們通常用緩存來保存一些熱點數據。但是,數據一致性是個挑戰,要保證緩存與源數據完全一致是不現實的,因此服務需要一個策略來保證緩存中的數據儘可能與源數據保持一致,同時正確處理緩存中過期的數據。
解決方案
現在有很多成熟的緩存解決方案,他們提供直讀(read-through)、直寫(write-through) / 回寫(write-behind)功能。使用這些緩存方案,服務可以先從緩存中獲取數據,如果緩存中不存在,再去源數據中獲取數據,同時添加到緩存中。任何對緩存數據的修改也會同步修改到源數據中。
服務如果不採取第三方緩存方案,也可以自己實現直讀、直寫,
下圖是採取緩存方案的數據讀取流程,
當涉及到數據更新時,服務可以模仿直寫方案,
- 更新源數據
- 把緩存中對應的數據置爲無效
當服務再次去讀這個數據時,更新後的數據就會被加載到緩存中,這個就是 Cache-Aside Pattern。
需要注意
在實現緩存方案時,有幾點需要注意,
- 緩存數據的生命週期。許多緩存都有數據過期策略來保證數據在一段時間沒有被訪問後,會從緩存中刪除掉。因此在實現緩存方案時,要選取一個合適的過期時間。如果時間過短,會導致服務頻繁從源數據獲取數據;如果時間過長,緩存中的數據和可能會變成髒數據。
- 數據淘汰。緩存的容量有限(一般緩存的存儲成本較高,容量不會很大),如果容量不足時,他們會逐出一部分數據。大部分緩存系統會採用LRU策略來決定逐出哪些數據。當然LRU不一定完全合適,服務可以根據數據本身的特點自定不同的淘汰策略,例如一部分數據查詢成本很高,那麼它最好一直保存在cache中,而不是被淘汰。
- 緩存預熱。緩存預熱表示在緩存啓動的同時,加載數據到緩存。
- 數據一致性。
- 本地緩存(內存)。