1. 程式人生 > >Asp.net mvc 網站之速度優化 -- 頁面快取

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>