記憶體策略,輸出記憶體與數據記憶體還是兩者兼而有之?
我正在開發一個 ASP.NET MVC 項目,並且已經到了要開始考慮記憶體策略的地步。我試圖讓我的框架盡可能開放,以便在記憶體中使用。
根據我在 Scott Hanselman 的播客中聽到的內容,StackOverflow.com 使用頁面輸出記憶體並將該內容壓縮並放入 RAM。聽起來這對於使用者範圍的記憶體非常有用,但對於個性化頁面之類的內容,您必須為每個使用者記憶體一個版本,這可能很快就會失控。
因此,對於記憶體策略。應該使用哪個,輸出記憶體、數據記憶體還是結合使用?我的第一個想法是兩者,但就記憶體依賴項而言,它聽起來可能會有點複雜。
小心過度激進的記憶體。儘管記憶體是一種有助於提高性能的工具,但如果使用不當,它實際上會使性能變得更差。
如果不了解有關您的項目的更多詳細資訊,我無法回答輸出記憶體或數據記憶體是否更適合您。我可以幫助提供幾個範例,說明何時使用一個而不是另一個。
如果您有一個經常在許多不同視圖中使用的特定數據集,那麼最好使用數據記憶體。如果您的數據獲取操作相對於您的數據呈現非常常見且成本高昂,您將使用它。如果您有多個使用相同數據的視圖,則可以節省數據獲取時間。
如果您有一個使用非常特定的數據集的視圖,並且該視圖的呈現很複雜,並且該視圖經常被請求(例如,堆棧溢出的首頁),那麼您將從輸出記憶體中受益匪淺。
所以最後,這真的取決於你的需要,小心使用記憶體不正確。
我們正在大規模(每天 300 萬次訪問)網站(新聞門戶)進行 API 和輸出記憶體。該站點主要由匿名使用者使用,但我們確實有經過身份驗證的使用者,並且由於站點的一些個性化部分,我們為他們記憶體了一個完整的站點,我必須承認我們在記憶體壓力方面絕對沒有問題。
因此,我的建議是在 API 記憶體中記憶體所有可以記憶體的內容,這樣您的輸出記憶體重建速度會更快。
當然,請密切注意性能計數器中的記憶體比率值。您應該會看到 >95% 的記憶體命中數。
另一個需要注意的是記憶體失效,如果你有很多相關的內容,這是一個大問題。例如,您記憶體音樂內容,而有關一張專輯或歌曲的資訊可能會顯示並記憶體在幾百頁上。如果那首歌有任何變化,您必須使所有這些頁面無效,這可能會出現問題。
歸根結底,記憶體是 ASP.NET 的最佳特性之一,它做得非常好,您可以信賴它。