緩存是在記憶體存儲資料的一項技術,也是ASP.NET中提供的重要特性之一。例如你可以在複雜查詢的時候緩存資料,這樣後來的請求就不需要從資料庫中取資料,而是直接從緩存中擷取。通過使用緩存可以提高應用程式的性能。
主要有兩種類型的緩存:
1.輸出緩存Output caching
2.資料緩存Data caching
使用輸出緩存,你可以緩存最後輸出的HTML頁面,當相同的頁面再次請求的時候,ASP.NET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面,文法如下:
<code>Duration</code> 屬性設定頁面将被緩存60妙。任何的使用者請求都會被緩存,在緩沖的60秒内相同的請求都會直接使用緩存的頁面。當緩存過期後ASP.NET會再次執行頁面代碼并且為下一個60秒建立一個新的HTML緩存。
在這個例子中頁面将被緩存20秒。
在實際應用中頁面往往會根據一些參數動态的改變頁面的内容。如果你的頁面是通過查詢字元串來擷取資訊的,你可以根據查詢字元串很容易的緩存頁面的不同拷貝。<code>VarByParam=”None”</code>指定ASP.NET隻存儲緩存頁面的一個拷貝。<code>VarByParam=”*”</code> 指定ASP.NET根據不同的查詢字元串存儲不同的緩存頁面。
上面的例子中,在查詢字元串中傳了不同的ID.ASP.NET為每一個ID都存儲了單獨的緩存頁面。這種方式會有一些問題就是當查詢字元串範圍很廣的時候。
這個時候我們可以在<code>VarByParam</code> 屬性中指定重要的查詢字元串變量的名字,如下:
這樣,ASP.NET可以根據id” or “langid”來緩存不同的緩存版本。
自定義緩存(Custom Caching)
你也可以建立自定義的程式來緩存頁面。ASP.NET提供了一種很便捷的方式來建立自定義緩存,使用<code>VarByCustom</code>屬性指定自定義緩存類型的名字。
你還要建立為緩存生成自定義字元串的方法,如下:
這個方法必須寫在<code>global.asax</code>檔案中。ASP.NET使用該方法傳回的字元串來實作緩存,如果這個方法在不同的請求中傳回相同的字元串,ASP.NET就會使用緩存的頁面,否則就會生成新的緩存版本。
上面的例子中<code>GetVaryByCustomString()</code>方法根據浏覽器的名字建立緩存字元串,ASP.NET會根據不同的浏覽器請求建立不同版本的緩存。
上面的緩存技術可以讓你很容易的緩存整個頁面,如果要緩存指定控件的内容,可以通過指定<code>VaryByControl</code> 屬性來完成。
上面代碼ASP.NET将會緩存<code>MyControl_1控件</code>20分鐘。如果要根據一些屬性值來緩存控件隻需要将OutPutCache指令加入<code>*.ascx</code>頁面。
<code>VaryByControl=”EmployeeID”</code>告訴ASP.NET根據控件中聲明的EmployeeID屬性來建立不同版本的緩存。
在 <code>.ascx.cs</code> 檔案加入<code>EmplyeeID</code>屬性為ASP.NET 緩存使用。
在頁面中增加控件并且設定 <code>EmployeeID</code>.
<code>web.config</code>可以配置緩存相關的設定,
你可以通過設定 <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允許我們寫一個回調函數,當緩存條目從緩存中移除的時候觸發。還可以設定緩存條目的優先級。
<a href="http://11011.net/software/vspaste"></a>
例子中建立了“Date1” 和 “Date2”緩存。“Date1” 在20秒後過期“Date2”為40秒。但是由于我們注冊了移除的回調函數,當“Date1” 或 “Date2”其中一個過期都會執行<code>CachedItemRemoveCallBack</code> 方法,在這個方法中移除了兩個緩存條目,ASP.NET還提供了處理緩存條目更新時的回調函數<code>CacheItemUpdateCallback</code> 。