【簡 介】
在 ASPNET 提供的許多特性中緩存支持無疑是我最欣賞的特性我這樣說當然是有充分理由的相比ASPNET的所有其他特性緩存對應用程序的性能具有最大的潛在影響利用緩存和其他機制ASPNET 開發人員可以接受使用開銷很大的控件(例如DataGrid)構建站點時的額外開銷而不必擔心性能會受到太大的影響為了在應用程序中最大程度地利用緩存您應該考慮在所有程序級別上都實現緩存的方法
實現
要實現頁面輸出緩存只要將一條 OutputCache 指令添加到頁面即可
<%@ OutputCache Duration= VaryByParam=* %>
如同其他頁面指令一樣該指令應該出現在 ASPX 頁面的頂部即在任何輸出之前它支持五個屬性(或參數)其中兩個是必需的
Duration
必需屬性頁面應該被緩存的時間以秒為單位必須是正整數
Location
指定應該對輸出進行緩存的位置如果要指定該參數則必須是下列選項之一AnyClientDownstreamNoneServer 或 ServerAndClient
VaryByParam
必需屬性Request 中變量的名稱這些變量名應該產生單獨的緩存條目none 表示沒有變動* 可用於為每個不同的變量數組創建新的緩存條目變量之間用 ; 進行分隔
VaryByHeader
基於指定的標頭中的變動改變緩存條目
VaryByCustom
允許在 globalasax 中指定自定義變動(例如Browser)
利用必需的 Duration 和 VaryByParam 選項的組合可以處理大多數情況例如如果您的產品目錄允許用戶基於 categoryID 和頁變量查看目錄頁您可以用參數值為 categoryID;page 的 VaryByParam 將產品目錄緩存一段時間(如果產品不是隨時都在改變一小時還是可以接受的因此持續時間是 秒)這將為每個種類的每個目錄頁創建單獨的緩存條目每個條目從其第一個請求算起將維持一個小時
VaryByHeader 和 VaryByCustom 主要用於根據訪問頁面的客戶端對頁面的外觀或內容進行自定義同一個 URL 可能需要同時為浏覽器和移動電話客戶端呈現輸出因此需要針對不同的客戶端緩存不同的內容版本或者頁面有可能已經針對 IE 進行了優化但需要能針對 Netscape 或 Opera 完全降低優化(而不僅僅是破壞頁面)後一個例子非常普遍我們將提供一個說明如何實現此目標的示例
示例VaryByCustom 用於支持浏覽器自定義
為了使每個浏覽器都具有單獨的緩存條目VaryByCustom 的值可以設置為 browser此功能已經內置在緩存模塊中並且將針對每個浏覽器名稱和主要版本插入單獨的頁面緩存版本
<%@ OutputCache Duration= VaryByParam=None VaryByCustom=browser %>
片段緩存用戶控件輸出緩存
緩存整個頁面通常並不可行因為頁面的某些部分是針對用戶定制的不過頁面的其他部分是整個應用程序共有的這些部分最適合使用片段緩存和用戶控件進行緩存菜單和其他布局元素尤其是那些從數據源動態生成的元素也應該用這種方法進行緩存如果需要可以將緩存的控件配置為基於對其控件(或其他屬性)的更改或由頁面級輸出緩存支持的任何其他變動進行改變使用同一組控件的幾百個頁面還可以共享那些控件的緩存條目而不是為每個頁面保留單獨的緩存版本
實現
片段緩存使用的語法與頁面級輸出緩存一樣但其應用於用戶控件(ascx 文件)而不是 Web 窗體(aspx 文件)除了 Location 屬性對於 OutputCache 在 Web 窗體上支持的所有屬性用戶控件也同樣支持用戶控件還支持名為 VaryByControl 的 OutputCache 屬性該屬性將根據用戶控件(通常是頁面上的控件例如DropDownList)的成員的值改變該控件的緩存如果指定了 VaryByControl可以省略 VaryByParam最後在默認情況下對每個頁面上的每個用戶控件都單獨進行緩存不過如果一個用戶控件不隨應用程序中的頁面改變並且在所有頁面都使用相同的名稱則可以應用 Shared=true 參數該參數將使用戶控件的緩存版本供所有引用該控件的頁面使用
示例
<%@ OutputCache Duration= VaryByParam=* %>
該示例將緩存用戶控件 秒並且將針對查詢字符串的每個變動針對此控件所在的每個頁面創建單獨的緩存條目
<%@ OutputCache Duration= VaryByParam=none
VaryByControl=CategoryDropDownList %>
該示例將緩存用戶控件 秒並且將針對 CategoryDropDownList 控件的每個不同的值針對此控件所在的每個頁面創建單獨的緩存條目
<%@ OutputCache Duration= VaryByParam=none VaryByCustom=browser
Shared=true %>
最後該示例將緩存用戶控件 秒並且將針對每個浏覽器名稱和主要版本創建一個緩存條目然後每個浏覽器的緩存條目將由引用此用戶控件的所有頁面共享(只要所有頁面都用相同的 ID 引用該控件即可)
頁面級和用戶控件級輸出緩存的確是一種可以迅速而簡便地提高站點性能的方法但是在 ASPNET 中緩存的真正靈活性和強大功能是通過 Cache 對象提供的使用 Cache 對象您可以存儲任何可序列化的數據對象基於一個或多個依賴項的組合來控制緩存條目到期的方式這些依賴項可以包括自從項被緩存後經過的時間自從項上次被訪問後經過的時間對文件和/或文件夾的更改以及對其他緩存項的更改在略作處理後還可以包括對數據庫中特定表的更改
在 Cache 中存儲數據
在 Cache 中存儲數據的最簡單的方法就是使用一個鍵為其賦值就像 HashTable 或 Dictionary 對象一樣
Cache[key] = value;
這種做法將在緩存中存儲項同時不帶任何依賴項因此它不會到期除非緩存引擎為了給其他緩存數據提供空間而將其刪除要包括特定的緩存依賴項可使用 Add() 或 Insert() 方法其中每個方法都有幾個重載Add() 和 Insert() 之間的唯一區別是Add() 返回對已緩存對象的引用而 Insert() 沒有返回值(在 C# 中為空在 VB 中為 Sub)
示例
CacheInsert(key myXMLFileData new
SystemWebCachingCacheDependency(ServerMapPath(usersxml)));
該示例可將文件中的 xml 數據插入緩存無需在以後請求時從文件讀取 CacheDependency 的作用是確保緩存在文件更改後立即到期以便可以從文件中提取最新數據重新進行緩存如果緩存的數據來自若干個文件還可以指定一個文件名的數組
CacheInsert(dependentkey myDependentData new
SystemWebCachingCacheDependency(new string[] {} new string[]
{key}));
該示例可插入鍵值為 key 的第二個數據塊(取決於是否存在第一個數據塊)如果緩存中不存在名為 key 的鍵或者如果與該鍵相關聯的項已到期或被更新則 dependentkey 的緩存條目將到期
CacheInsert(key myTimeSensitiveData null
DateTimeNowAddMinutes() TimeSpanZero);
[] []
From:http://tw.wingwit.com/Article/program/net/201311/15384.html