輸出緩存
這是最簡單的緩存類型,它保存發送到客戶端的頁面副本,當下一個客戶端發送相同的頁面請求時,此頁面不會重新生成(在緩存有限期內),而是從緩存中獲取該頁面;當然由于緩存過期或被回收,這時頁面會重新生成。
我們要實現輸出緩存,只需在頁面中添加如下代碼:
<%@ OutputCache Duration="23" VaryByParam="None" %>
它支持五個屬性,其中兩個屬性Duration和VaryByParam是必填的
Duration | 必需屬性。頁面應該被緩存的時間,以秒為單位。必須是正整數。 |
Location | 指定應該對輸出進行緩存的位置。如果要指定該參數,則必須是下列選項之一:Any、Client、Downstream、None、Server 或 ServerAndClient。 |
VaryByParam | 必需屬性。Request 中變量的名稱,這些變量名應該產生單獨的緩存條目。"none" 表示沒有變動。"*" 可用于為每個不同的變量數組創建新的緩存條目。變量之間用 ";" 進行分隔。 |
VaryByHeader | 基于指定的標頭中的變動改變緩存條目。 |
VaryByCustom | 允許在 global.asax 中指定自定義變動(例如,"Browser")。 |
表1輸出緩存屬性
這里我們把輸出緩存的有效期設置為23秒,也就是說,當緩存超過有效期就會被回收;當用戶再次請求該頁面時,就要重新創建頁面。
前面我們介紹了輸出緩存的使用,只需在頁面中添加OutputCache指令,假設我們要在幾個頁面中添加輸出緩存這可能比較簡單,但我們要在幾十個頁面中添加輸出緩存功能,而且前面介紹的例子中Duration屬性值都是直接Hard code到每個頁面中,如果我們需要修改Duration屬性值,那么就必須修改每個頁面了,ASP.NET還需要重新編譯這些頁面,這不利于我們的維護,最重要的是增加了我們的工作量。
其實,我們可以在web.config文件中定義一個outputCacheProfile(ProductCacheProfile),然后在頁面中添加CacheProfile屬性并且賦值為ProductCacheProfile,web.config文件設置如下:
<caching>
? <!-- Sets out put cache profile-->
? <outputCacheSettings>
??? <outputCacheProfiles>
????? <add name="ProductCacheProfile" duration="30"/>
??? </outputCacheProfiles>
? </outputCacheSettings>
</caching>
現在,我們在頁面中添加CacheProfile屬性,并且設置為ProductCacheProfile,如下所示:
<%@ OutputCache CacheProfile="ProductCacheProfile" VaryByParam="None" %>
客戶端緩存
另一種選擇是客戶端緩存,如果用戶在瀏覽器中點擊“后退”按鈕或在地址欄中重新輸入URL,那么在這種情況下,瀏覽器將從緩存獲取頁面;然而,如果用戶點擊“刷新”按鈕,那么瀏覽器中緩存將失效,瀏覽器發送頁面請求。
如果我們要使用客戶端緩存,只需指定OutputCache中的屬性Location=”Client”就OK了,具體代碼如下所示:
<%@ OutputCache Duration="23" VaryByParam="None" Location="Client" %>
Query String緩存
如果查詢參數和前一個請求相同并且該頁面緩存有效,那么緩存將被重用,否則,創建一個新的頁面緩存。
前面我們把VaryByParam設置為“*”,所以ASP.NET程序對ProductName和ProductId都創建頁面緩存
如果我們只針對ProductName創建頁面緩存,這時我們可以修改VaryByParam,具體如下所示:
<%@ OutputCache Duration="30" VaryByParam="productname" %>
自定義緩存控件
我們可以通過設置VaryByCustom屬性來實現。
假設,現在我們要設計基于不同UserHostName的緩存,由于程序在執行過程中,首先調用全局方法GetVaryByCustomString()來確定是否緩存頁面或重用現有的,所以我們可以通過重寫GetVaryByCustomString()方法實現基于UserHostName的緩存,首先我們創建一個Global.asax文件然后重新全局方法GetVaryByCustomString()具體實現如下:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
??? if (string.Equals(custom, "UserHostName", StringComparison.OrdinalIgnoreCase))
??? {
?????? ?// Indicates that the cache should be vary on user host name.
??????? return Context.Request.UserHostName;
??? }
??? return base.GetVaryByCustomString(context, custom);
}
前面我們重寫了GetVaryByCustomString()方法,使得UserHostName值不同時,獲取相應的緩存值。
然后讓程序基于UserHostName創建緩存,所以我們要在頁面添加以下代碼:
<%@ OutputCache Duration="30" VaryByParam="None" VaryByCustom="UserHostName" %>
我們通過自定義現在GetVaryByCustomString()方法,實現了Web程序根據UserHostName實施不同的緩存方式,其實,我們還可以實現更多種類緩存方案,例如:基于用戶角色、時間和Url等等。
片段緩存
為了實現片段緩存,我們需要創建自定義控件緩存部分頁面,然后我們把OutputCache指令添加到自定義控件中,這樣整個頁面將不會被緩存,而自定義緩存控件除外。
數據緩存
Cache對象是線程安全:這表示無需顯式實現鎖定或解鎖,在添刪Cache對象中的元素,然而,在Cache對象中元素必須是線程安全的。例如,我們創建一個實體Product,而且存在多個客戶端可能同時操作該對象的情況,這時我們必須為實體Product實現鎖定和解鎖操作(同步操作請參考《單例模式(Singleton)的6種實現》)。
Cache對象中的緩存項自動移除:當緩存過期,依賴項被修改或內存不足緩存ASP.NET會自動移除該緩存項。
緩存項支持依賴關系:我們可以給緩存項添加文件、數據庫表或其他資源類型的依賴關系。
緩存的依賴關系
緩存項之間的依賴
ASP.NET Cache允許我們建立緩存之間的依賴關系,即一個緩存項依賴于另一個緩存項;以下示例代碼創建了二個緩存項,并且它們之間建立依賴關系。具體實現如下:
// Creates cache object Key1.
Cache["Key1"] = "Cache Item 1";
?
// Makes Cache["Key2"] dependent on Cache["Key1"].
string[] dependencyKey = new string[1];
dependencyKey[0] = "Key1";
?
// Creates a CacheDependency object.
CacheDependency dependency = new CacheDependency(null, dependencyKey);
?
// Establishs dependency between cache Key1 and Key2.
Cache.Insert("Key2", "Cache Item 2", dependency);
現在,當Key1緩存項更新或從緩存中刪除,Key2緩存項就會自動從緩存刪除。
文件依賴
前面我們介紹了緩存項之間的依賴關系,ASP.NET Cache還提供緩存項與文件之間的依賴關系,當文件被更新或刪除對應的緩存項也將失效。
?