Asp.net mvc 網站之速度優化 -- 頁面快取
網站速度優化的一般方法
由於網站最重要的使用者體驗就是速度,特別是對於電子商務網站而言。
一般網站速度優化會涉及到幾個方面:
1. 資料庫優化 — 查詢欄位簡歷索引,使用資料庫連線池和持久化,現在還有種趨勢,就是選擇使用No SQL作為補充;
2. 資料快取 — 使用Memcached等;
3. 負載均衡 — 使用ngnix等
4. 頁面快取 — 將.aspx, .jsp等動態頁面快取或靜態化為.html頁面
5. 前端優化 — Yahoo 14條前端優化原則。
城江湖(Incity.me)針對 2 資料快取, 4 頁面靜態化, 5 Yahoo 14條優化原則做了具體的實踐,並獲得了實際效果,以後的系列文章會舉出一些實踐方法和列出部分程式碼,這次主要針對頁面快取進行說明。
哪些地方需要頁面快取?
以InCity為例,首頁,商品分類,幫助中心等都是用於展示商品和網站資訊的,與使用者的互動相對較少。在某個時間段內(1小時),所有使用者看到的頁面都應該是相同的, 並不會因為不同的使用者而顯示不同的資訊。
全域性頁面快取 OutputCache
InCity是基於ASP.NET MVC開發的,熟悉ASP.NET MVC的童鞋都知道,ASP.NET MVC自帶了一個屬性叫OutputCache, 最常用的是Duration和VaryByParam兩個引數:
MSDN:
Duration:表示頁或使用者控制元件進行快取的時間(以秒計)
VaryByParam:分號分隔的字串列表,用於使輸出快取發生變化。
Code:
[OutputCache(Duration="3600" VaryByParam="type")]
public ActionResult Catalog(string type)
解釋一下:
1. 使用者第一次輸入http://incity.me/catalog/food,從後臺獲取,併為catalog/food生成快取頁面,3600秒內快取頁面有效。
2. 使用者再次輸入http://incity.me/catalog/food,從快取頁面獲取。
3. 當用戶第一次輸入http://incity.me/catalog/play的時候,因為{type}從food變成了play,資料從後臺獲取,併為catalog/play生成快取程式碼3600秒內有效。
4.使用者再次輸入http://incity.me/catalog/play,從快取頁面獲取。
區域性頁面快取 PartOutputCache
上 述的解決方法對於大部分都可以處理,但是如果遇到下面的情況怎麼辦?登入前首頁右側的面板是顯示登入區,登入後是顯示使用者資訊,而首頁如果採用 OutputCache全域性頁面快取的話,則右側顯示不同的賬戶資訊的。因為前面我們已經提到,在某個時間段內(1小時),所有使用者看到的頁面都應該是相 同的。
登入前:
登入後:
這時候就需要針對左側的商品作區域性快取,而對右側不使用快取。如何達到這個效果呢?遺憾的是,這時候微軟官方的ASP.NET MVC並未提供這種功能,因此參考使用了PartOutputCache,用法如下:
[PartOutputCache(CacheDuration = 3600)]
public ActionResult ShowCase()
aspx頁面程式碼則變成了
<div id=”Container”>
<!–使用了快取–>
<%Html.RenderAction<HomeController>(p => p.IndexShowCase());%>
<!–沒有使用快取–>
<%Html.RenderAction<HomeController>(p => p.LoginPanel());%>
</div>