.NET Petshop詳解(五):petshop輸出快取設定 (轉)

gugu99發表於2007-10-19
.NET Petshop詳解(五):petshop輸出快取設定 (轉)[@more@]

Petshop詳解(五):petshop輸出快取設定:namespace prefix = o ns = "urn:schemas--com::office" />

.NET的輸出快取

衡量高、可縮放的應用最重要的一個指標就是快取了。提供了高效能的web應用程式的快取功能,ASP.NET 有三種可由 Web 應用程式使用的快取:

·  .com/quickstart/aspplus/doc/outputcaching.">輸出快取,它快取請求所生成的動態響應。

·  ,它快取請求所生成的響應的各部分。

·  ,它以方式快取任意。為支援這種快取,ASP.NET 提供了全功能的快取引擎,使程式設計師能夠輕鬆地在請求間保留資料。

頁的輸出快取是非常有用的。在海量的訪問站點中,有些頁面的訪問頻率佔了非常大的比重,即使對這些頁使用輸出快取很少的時間,也會減輕不少的負擔,因為後面對這些頁面的請求將不在建立該頁的程式碼。

但是,這樣顯得不夠靈活,頁的請求可能的確是很多,然而在頁面上我們快取了所有的東西,無論是構造成本高還是構造成本低的部分。能否有一種可以快取頁的部分的資料呢?幸運的是ASP.NET提供了針對每個請求來建立或自定義該頁的各部分。比如說我們可以對頁面上構造成本很高的做片斷快取。

ASP.NET 快取支援和快取鍵依賴項,使開發人員可以使快取項依賴於外部檔案或其他快取項。此項技術可用於在項的基礎資料來源發生更改時使該項無效。 ASP.NET可以將這些項在 Web 上或請求流中的其他上,例如伺服器或。這可以使您避免重新建立滿足先前請求的資訊,特別是當在伺服器上建立時要求大量時間或其他資源的資訊。

Petshop的頁快取設定

我們可以可透過使用低階別的 OutputCache 或高階別的 @ OutputCache 指令來實現頁的輸出快取。 啟用輸出快取後,當發出對頁的第一個 GET 請求時建立一個輸出快取項。隨後的 GETHEAD 請求由該輸出快取項服務,直到該快取請求過期。 輸出快取還支援快取的 GETPOST 名稱/值對的變體。

輸出快取遵循頁的過期和有效性策略。如果某頁位於輸出快取中,並且有一個過期策略標記指示該頁自快取起 60 分鐘後過期,則在 60 分鐘後將該頁從輸出快取中移除。如果此後接收到另一個請求,則執行頁程式碼,並且可以再次快取該頁。

下面的指令在響應時啟用輸出快取:

Duration和VaryByParam是必選引數,前者標識過期時間,後者表示GETPOST 名稱/值對的字串。如果不使用該屬性,可是設定為none。在這裡我們還要說明一個引數VaryByCustom,使用這個引數,我們可以自定義輸出快取要求的任意文字。除了在OutputCache指令裡面申明該屬性之外,我們還得在應用程式的 global.asax 檔案的程式碼宣告塊中,重寫 GetVaryByCustomString 方法來為自定義字串指定輸出快取的行為。

舉一列來說:

這裡的VaryByCustom定義的為CategoryPageKey,那麼在global.asax裡面我們必須定義CategoryPageKey這個字元創輸出快取的行為,見下面程式碼。

public overr string GetVaryByCustomString(HttpContext context, String arg) {

  string cacheKey = "";

  switch(arg) {

  case "CategoryPageKey":

  if (Request.IsAuthenticated == true) {

  cacheKey = "qqQ" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];

  }

  else {

  cacheKey = "AAA" + context.Request.QueryString["category_id"] + context.Request.QueryString["requestedPage"];

  }

  break;

  case "SearchPageKey" :

  if (Request.IsAuthenticated == true) {

  cacheKey = "QQQ" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];

  }

  else {

  cacheKey = "AAA" + context.Request.QueryString["search_text"] + context.Request.QueryString["requestedPage"];

  }

  break;

  case "ProductPageKey" :

  if (Request.IsAuthenticated == true) {

  cacheKey = "QQQ" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];

  }

  else {

  cacheKey = "AAA" + context.Request.QueryString["name"] + context.Request.QueryString["product_id"] + context.Request.QueryString["requestedPage"];

  }

  break;

  case "ProductDetailsPageKey" :

  if (Request.IsAuthenticated == true) {

  cacheKey = "QQQ" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];

  }

  else {

  cacheKey = "AAA" + context.Request.QueryString["item_id"] + context.Request.QueryString["requestedPage"];

  }

  break;

  case "UserID" :

  if (Request.IsAuthenticated == true) {

  cacheKey = "UserID_In";

  }

  else {

  cacheKey = "UserID_Out";

  }

  break;

  }

  return cacheKey;

  }

從上面對CategoryPageKey字元創所作的行為來看,當我們的請求頁面中含有對特定的category_id的某一分頁顯示的資料頁的請求時,將快取(自然是已經快取了該頁)。

下表列出了petshop的web應用程式的輸出快取設定。

ASP.NET WebForms

Cache setting

Duration

ControlHeader

  Duration="43200" 

  VaryByParam="none"

  VaryByCustom="UserID" %>

12 hours

Default

  Duration="43200"

  VaryByParam="none"

  VaryByCustom="UserID" %>

12 hours

Help

  Duration="43200" 

  VaryByParam="none"

  VaryByCustom="UserID" %>

12 hours

Category

  Duration="43200" 

   VaryByParam="none"

  VaryByCustom="CategoryPageKey " %>

12 hours

Product

  Duration="43200" 

  VaryByParam="none"

  VaryByCustom="ProductPageKey " %>

12 hours

ProductDetails

  Duration="43200" 

  VaryByParam="none"

  VaryByCustom="ProductDetailsPageKey " %>

12 hours

Search

  Duration="43200" 

  VaryByParam="none"

  VaryByCustom="SearchPageKey " %>

12 hours

顯然petshop的web頁面上部的ControlHeader是隨著使用者登陸的狀態有關的,故其設定了VaryByCustom屬性以來標識使用者不同登陸狀態的快取版本。而Category頁面由於可能被大量的訪問,並且資料量很大,是十分有必要快取的,但是由於資料的隨機性很大,存在不同的版本,比如說是不同類別的Category,甚至不同的分頁顯示的資料頁,在這裡採用了VaryByCustom屬性以快取不同版本的頁。

Petshop片斷快取

在前面我們提到ASP.NET可以提供頁的區域性資料的快取,通常是一些構造代價較大的部分,諸如使用者控制元件。在petshop裡面,大量使用了使用者控制元件(尤其是.NET示例程式Duwamish7.0使用了更多的使用者控制元件,那些頁面簡直就是控制元件的拼裝),使用者控制元件的快取設定方法和aspx頁的快取設定方法基本相同,在這裡我們不再列出。只有ControlHeader控制元件使用了快取設定,見上表。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-977628/,如需轉載,請註明出處,否則將追究法律責任。

相關文章