十個常見的快取使用誤區及建議

TP_funny發表於2014-09-11
Omar Al Zabir 的《Ten Caching Mistakes that Break your App》這篇文章已經發表好多年了,但是它仍然指導著大家如何合理、高效的使用快取。在日常工作中,開發者經常利用快取來優化站點或應用程式,然而在實際應用中,大家使用快取時,總會存在或多或少的誤區,反而影響了站點或應用程式的正常執行。近日,highscalability 上的一篇文章總結了十大使用快取的誤區和建議

現就對這十大快取誤區以及使用建議進行一個全面的梳理:

1、依賴預設的序列化方式

使用預設的序列化處理方式可能會消耗大量的 CPU 資源,尤其是處理複雜型別資料時。所以建議大家一定要根據所使用語言和環境的情況,採用最合理、有效的序列化和反序列化方式。

2、在單一快取中儲存大物件資料

由於序列化和反序列化需要一定的資源開銷,當處於高併發高負載的情況下,對大物件資料的頻繁讀取有可能會使得伺服器的 CPU 崩潰,所以建議大家把大物件資料分成為較小的子物件,然後再各自進行快取。

3、在不同執行緒間使用快取共享物件

在競態條件(Race conditions)條件下,當寫執行緒對快取進行寫入操作時,如果這是讀執行緒剛好也要訪問同一緩衝物件,就有可能讀取髒資料,所以在實際開發中要根據實際情況採取外部鎖機制,以保證快取資料的正確讀寫。

4、認為儲存資料操作後,資料即刻就能儲存到快取中

剛進行寫入快取操作的資料並不一定能夠馬上寫入快取,這是因為當快取空間不足時,剛寫入的快取有可能被重新整理掉。所以在編寫程式時,應該首先對獲得快取的值作空值檢測。

5、使用巢狀物件儲存整個集合

如果將整個集合物件資料進行巢狀快取的話,獲得其中某個具體元素的效能將會嚴重受到影響,這是因為整個集合儲存意味著對整個巢狀物件進行序列化。有鑑於此,建議單獨對每個元素進行快取,這樣就可以做到對每個物件分別更新和讀取,以減少序列化的影響。

6、對父子物件採取統一與單獨混用的儲存方式

有時候一個物件可能擁有兩個或更多的父物件,同一物件儲存在不同地方,這樣就會造成快取的浪費。為了不讓同一物件儲存於不同地方,這就需要根據統一物件本身的鍵進行快取,這樣父物件就能夠根據需要訪問子物件。

7、對配置資訊進行快取

快取資料的訪問是有代價的,所以要儘可能把影響減到最低,所以建議使用本地靜態變數代替快取對配置資料進行儲存。

8、對實時物件進行快取

如果對實時物件(例如:流、檔案、註冊資訊或者網路情況)的引用進行快取的話,當快取資料被刪除後,之前快取的實時物件不被刪除,這樣會造成系統資源洩漏,所以不要對實時物件進行儲存。

9、使用多個鍵儲存同一物件

儘管使用多個鍵儲存同一物件就使得使用一個鍵和索引號來進行訪問時帶來便利,但是當快取是基於遠端快取的話,任何關於物件改變都是不可見的,這樣會導致快取資料同步問題的發生,所以不建議使用多個鍵儲存同一物件。

10、在連續儲存中進行更新或刪除後不及時更新相應快取物件

由於在一個遠端快取中,資料以拷貝方式儲存,所以當更新物件時,快取不會被同步更新。所以更新物件時,快取必須被明確地進行更新。然而在基於記憶體的快取中,當刪除一個物件時,在快取中不會被同步刪除,所以建議通過程式確保快取物件被正確刪除。
來自:InfoQ
相關閱讀
評論(3)

相關文章