.NET Petshop詳解(五):petshop輸出快取設定 (轉)
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 請求時建立一個輸出快取項。隨後的 GET 或 HEAD 請求由該輸出快取項服務,直到該快取請求過期。 輸出快取還支援快取的 GET 或 POST 名稱/值對的變體。
輸出快取遵循頁的過期和有效性策略。如果某頁位於輸出快取中,並且有一個過期策略標記指示該頁自快取起 60 分鐘後過期,則在 60 分鐘後將該頁從輸出快取中移除。如果此後接收到另一個請求,則執行頁程式碼,並且可以再次快取該頁。
下面的指令在響應時啟用輸出快取:
Duration和VaryByParam是必選引數,前者標識過期時間,後者表示GET 或 POST 名稱/值對的字串。如果不使用該屬性,可是設定為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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PetShop的系統架構設計(一)(轉)架構
- PetShop的系統架構設計架構
- PetShop4.0 架構說明(轉載)架構
- 在asp.net web api中利用過濾器設定輸出快取ASP.NETWebAPI過濾器快取
- asp.net輸出快取的使用ASP.NET快取
- Apache 設定web 快取(轉)ApacheWeb快取
- PHP 輸出快取PHP快取
- ASP.NET 2.0中的頁面輸出快取ASP.NET快取
- WebView 設定快取WebView快取
- Mybatis快取詳解MyBatis快取
- 系統快取全解析2:頁面輸出快取快取
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- Nginx快取設定教程Nginx快取
- 高速輸出-我們戲說快取快取
- 兩級快取實現分析之快取設定快取
- OkHttp設定支援Etag快取HTTP快取
- 深入Nginx + PHP 快取詳解NginxPHP快取
- JuiceFS 快取預熱詳解UI快取
- 瀏覽器快取詳解瀏覽器快取
- 【轉】設定db_keep_cache_size快取,並把一個表快取進去快取
- NetCore的快取使用詳例NetCore快取
- 關於GD和OB快取的輸出快取
- Git設定彩色輸出Git
- hadoop輸出設定Hadoop
- top命令輸出詳解
- .Net 下通過快取提高TCP傳輸速度快取TCP
- 快取穿透詳解及解決方案快取穿透
- .NET 快取快取
- 組策略常用設定詳解 -轉載
- nginx快取使用詳解,nginx快取使用及配置步驟Nginx快取
- http強制快取、協商快取、指紋ETag詳解HTTP快取
- 詳解cookie、session和HTTP快取CookieSessionHTTP快取
- 程式設計師筆記| 詳解Eureka 快取機制程式設計師筆記快取
- ASP.NET2.0揭祕讀書筆記之八——頁面輸出快取ASP.NET筆記快取
- free -m命令輸出詳解
- iOS OpenGL ES FBO 幀快取區 渲染快取區詳解iOS快取
- Hibernate中一級快取和二級快取使用詳解快取
- 快來體驗快速通道,netty中epoll傳輸協議詳解Netty協議