
緩存是在記憶體存儲資料的一項技術,也是ASP.NET中提供的重要特性之一。例如你可以在複雜查詢的時候緩存資料,這樣後來的請求就不需要從資料庫中取資料,而是直接從緩存中擷取。通過使用緩存可以提高應用程式的性能。
主要有兩種類型的緩存:
1.輸出緩存Output caching
2.資料緩存Data caching
使用輸出緩存,你可以緩存最後輸出的HTML頁面,當相同的頁面再次請求的時候,ASP.NET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面,文法如下:
<a href="http://11011.net/software/vspaste"></a>
<code>Duration</code> 屬性設定頁面将被緩存60妙。任何的使用者請求都會被緩存,在緩沖的60秒内相同的請求都會直接使用緩存的頁面。當緩存過期後ASP.NET會再次執行頁面代碼并且為下一個60秒建立一個新的HTML緩存。
在這個例子中頁面将被緩存20秒。
在實際應用中頁面往往會根據一些參數動态的改變頁面的内容。如果你的頁面是通過查詢字元串來擷取資訊的,你可以根據查詢字元串很容易的緩存頁面的不同拷貝。<code>VarByParam=”None”</code>指定ASP.NET隻存儲緩存頁面的一個拷貝。<code>VarByParam=”*”</code> 指定ASP.NET根據不同的查詢字元串存儲不同的緩存頁面。
<%@OutputCacheDuration="60"VaryByParam="id;langid"%>
這樣,ASP.NET可以根據id” or “langid”來緩存不同的緩存版本。
自定義緩存(Custom Caching)
你也可以建立自定義的程式來緩存頁面。ASP.NET提供了一種很便捷的方式來建立自定義緩存,使用<code>VarByCustom</code>屬性指定自定義緩存類型的名字。
你還要建立為緩存生成自定義字元串的方法,如下:
public override stringGetVaryByCustomString(HttpContext context, stringcustom)
{
if(custom == "browser")
{
returncontext.Request.Browser.Browser +
context.Request.Browser.MajorVersion;
}
else
{
return base.GetVaryByCustomString(context, custom);
}
這個方法必須寫在<code>global.asax</code>檔案中。ASP.NET使用該方法傳回的字元串來實作緩存,如果這個方法在不同的請求中傳回相同的字元串,ASP.NET就會使用緩存的頁面,否則就會生成新的緩存版本。
上面的例子中<code>GetVaryByCustomString()</code>方法根據浏覽器的名字建立緩存字元串,ASP.NET會根據不同的浏覽器請求建立不同版本的緩存。
上面的緩存技術可以讓你很容易的緩存整個頁面,如果要緩存指定控件的内容,可以通過指定<code>VaryByControl</code> 屬性來完成。
<%@OutputCacheDuration="20"VaryByControl="MyControl_1"%>
上面代碼ASP.NET将會緩存<code>MyControl_1控件</code>20分鐘。如果要根據一些屬性值來緩存控件隻需要将OutPutCache指令加入<code>*.ascx</code>頁面。
<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControl.ascx.cs"Inherits="Controls_MyControl"%>
<%@OutputCacheDuration="20"VaryByControl="EmployeeID"%>
......
<code>VaryByControl=”EmployeeID”</code>告訴ASP.NET根據控件中聲明的EmployeeID屬性來建立不同版本的緩存。
在 <code>.ascx.cs</code> 檔案加入<code>EmplyeeID</code>屬性為ASP.NET 緩存使用。
private int_employeeID;
public intEmployeeID
get{ return_employeeID; }
set{ _employeeID = value; }
protected voidPage_Load(objectsender, EventArgs e)
lblDate.Text = DateTime.Now.ToShortDateString();
lblTime.Text = DateTime.Now.ToLongTimeString();
lblEmployeeID.Text = EmployeeID.ToString();
在頁面中增加控件并且設定 <code>EmployeeID</code>.
<%@RegisterSrc="Controls/MyControl.ascx"TagName="MyControl"TagPrefix="uc1"%>
<asp:ContentID="Content1"ContentPlaceHolderID="ContentPlaceHolder1"runat="Server">
<divalign="center">
<uc1:MyControlID="MyControl1"runat="server"EmployeeID="1"></uc1:MyControl>
</div>
</asp:Content>
<code>web.config</code>可以配置緩存相關的設定,
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname="ProductItemCacheProfile" duration="60"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
你可以通過設定 <code>CacheProfile=”ProfileName”</code> 屬性 來使用上面的配置:
ASP.NET還提供了另一種靈活的緩存類型:資料緩存。你可以将一些耗費時間的條目加入到一個對象緩存集合中,以鍵值的方式存儲。
Cache["Name"] = data;
我們可以通過使用<code>Cache.Insert()</code>方法來設定緩存的過期,優先級,依賴項等。
ASP.NET允許你設定一個絕對過期時間或滑動過期時間,但不能同時使用。
緩存依賴項使緩存依賴于其他資源,當依賴項更改時,緩存條目項将自動從緩存中移除。緩存依賴項可以是應用程式的 Cache 中的檔案、目錄或與其他對象的鍵。如果檔案或目錄更改,緩存就會過期。
date2 = DateTime.Now;
string[] cacheKeys = { "Date1"};
CacheDependency cacheDepn = newCacheDependency(null, cacheKeys);
Cache.Insert("Date2", date2, cacheDepn);
上面的例子“Date2”緩存對象依賴“Date1”緩存條目,當 “Date1” 對象過期後“Date2” 将會自動過期。<code>CacheDependency(null, cacheKeys)</code>中的第一個參數為空是由于我們隻監視緩存鍵的更改情況。
ASP.NET允許我們寫一個回調函數,當緩存條目從緩存中移除的時候觸發。還可以設定緩存條目的優先級。
例子中建立了“Date1” 和 “Date2”緩存。“Date1” 在20秒後過期“Date2”為40秒。但是由于我們注冊了移除的回調函數,當“Date1” 或 “Date2”其中一個過期都會執行<code>CachedItemRemoveCallBack</code> 方法,在這個方法中移除了兩個緩存條目,ASP.NET還提供了處理緩存條目更新時的回調函數<code>CacheItemUpdateCallback</code> 。
本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2009/11/08/AspDotNetCache.html,如需轉載請自行聯系原作者