天天看點

【翻譯】10個破壞程式的緩存錯誤

這裡是10個錯誤。(總結):

依靠一個預設的串行器。預設的串行器會消耗大量cpu,特别是複雜類型。為你的語言和環境花點思維考慮最好的序列化和反序列化模式。

把大型對象存儲到一個單一的緩存項。因為序列化和反序列化開銷,在并發負載下,頻繁的通路大型對象圖示會殺掉你的伺服器cpu。取而代之的是把達标拆成小的子表,然後分别緩存。隻檢索你需要的最小單元。

線上程之間使用緩存共享對象。競争條件,當寫被包含,開發中如果遇到程式某部分需要同時存取相同緩存項。那麼某種形式的外部鎖機制是必要的。

假設資料項儲存之後會被立即緩存。永遠不要假設一個資料項會在緩存中,即使這隻是寫操作,因為一個緩存會重新整理資料項,當記憶體緊張時。代碼應該總是檢查讀取緩存的傳回值是否為空。

存儲整個嵌套對象集合。因為序列化的開銷。如果存儲了整個集合,那麼當你需要擷取一個詳細的資料項時會導緻一個貧乏的性能。

存儲主從關系對象一起也分開。有些時候一個對象會同時包含到兩個或更多父對象。不要把相同的對象用各自的key存儲到緩存中兩個不同的地方。父對象當需要通路時會讀取這個對象。

緩存配置設定。存儲配置資料在本地程序的靜态變量中。通路緩存資料是昂貴的,是以,在可能的時候,你會想要避免這個開銷。

緩存打開處理流的活動對象,檔案,注冊中心,或者網絡。不要緩存有引用資源的對象,比如檔案,資料流,記憶體等等。當緩存項被從緩存中删除時,這些資源依然沒有被删除,然後系統資源就會洩露。

用多個key存儲相同的資料項。它能讓你通過key和一個索引編碼友善的通路一個資料項。當緩存在記憶體中時,這能工作,因為緩存能包含一個引用指向相同的項目,因為對象的改變會通過通路路徑發現。當使用一個遠端緩存,任何更新不再顯而易見,是以這個項目會不再同步。

在從永久性儲存設備中更新或删除資料之後沒有更新或删除緩存中的資料項。在遠端緩存中的資料項是用拷貝的方式存儲的,是以更新一個對象不會更新緩存。緩存必須專門為了被其他人看到改變而更新。記憶體中的緩存對象變更會被任何一個看到。和删除相同,删除一個對象不會把它從緩存中删除。緩存項的正确删除需要由程式來保證。