熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET緩存介紹

2013-11-13 10:41:47  來源: .NET編程 

  

  ASPNET緩存

  ASP.NET緩存介紹

  介紹

  緩存是在內存存儲數據的一項技術也是ASPNET中提供的重要特性之一例如你可以在復雜查詢的時候緩存數據這樣後來的請求就不需要從數據庫中取數據而是直接從緩存中獲取通過使用緩存可以提高應用程序的性能

  主要有兩種類型的緩存

  輸出緩存Output caching

  數據緩存Data caching

   輸出緩存(Output Caching)

  使用輸出緩存你可以緩存最後輸出的HTML頁面當相同的頁面再次請求的時候ASPNET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面語法如下

復制代碼代碼如下:
<%@ OutputCache Duration=”” VaryByParam=”None” %> 
Duration 屬性設置頁面將被緩存任何的用戶請求都會被緩存在緩沖的秒內相同的請求都會直接使用緩存的頁面當緩存過期後ASPNET會再次執行頁面代碼並且為下一個秒創建一個新的HTML緩存 
復制代碼代碼如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPagemaster" AutoEventWireup="true" CodeFile="OutputCachingTestaspxcs" Inherits="OutputCachingTest" Title="Page" %> 
<%@ OutputCache Duration="" VaryByParam="None" %> 
<asp:Content ID="Content" ContentPlaceHolderID="ContentPlaceHolder" runat="Server"> 
<div class="title">Output Cache</div> 
Date: <asp:Label ID="lblDate" runat="server" Text="" /> 
Time: <asp:Label ID="lblTime" runat="server" Text="" /> 
</asp:Content> 
protected void Page_Load(object sender EventArgs e) 

lblDateText = DateTimeNowToShortDateString(); 
lblTimeText = DateTimeNowToLongTimeString(); 


在這個例子中頁面將被緩存 

通過查詢字符串緩存(Cache by Query String ) 

在實際應用中頁面往往會根據一些參數動態的改變頁面的內容如果你的頁面是通過查詢字符串來獲取信息的你可以根據查詢字符串很容易的緩存頁面的不同拷貝VarByParam=”None”指定ASPNET只存儲緩存頁面的一個拷貝VarByParam=”*” 指定ASPNET根據不同的查詢字符串存儲不同的緩存頁面 
復制代碼代碼如下:
<%@ OutputCache Duration="" VaryByParam="*" %> 
<div align="right"> 
<a href="OutputCachingTestaspx">No Query String</a> | 
<a href="OutputCachingTestaspx?id=">ID </a> | 
<a href="OutputCachingTestaspx?id=">ID </a> | 
<a href="OutputCachingTestaspx?id=">ID </a> | 
<a href="OutputCachingTestaspx?id=&langid=">ID </a> 
</div> 
上面的例子中在查詢字符串中傳了不同的IDASPNET為每一個ID都存儲了單獨的緩存頁面這種方式會有一些問題就是當查詢字符串范圍很廣的時候 
這個時候我們可以在VarByParam 屬性中指定重要的查詢字符串變量的名字如下 
復制代碼代碼如下:
%@OutputCacheDuration=""VaryByParam="id;langid"% 
自定義緩存(Custom Caching) 
你也可以創建自定義的程序來緩存頁面ASPNET提供了一種很便捷的方式來創建自定義緩存使用VarByCustom屬性指定自定義緩存類型的名字 
你還要創建為緩存生成自定義字符串的方法如下 
復制代碼代碼如下:
public override stringGetVaryByCustomString(HttpContext context stringcustom) 

if(custom == "browser") 

returncontextRequestBrowserBrowser + 
contextRequestBrowserMajorVersion; 

else 

return baseGetVaryByCustomString(context custom); 



這個方法必須寫在globalasax文件中ASPNET使用該方法返回的字符串來實現緩存如果這個方法在不同的請求中返回相同的字符串ASPNET就會使用緩存的頁面否則就會生成新的緩存版本 
上面的例子中GetVaryByCustomString()方法根據浏覽器的名字創建緩存字符串ASPNET會根據不同的浏覽器請求創建不同版本的緩存 
控件緩存(Control Cache ) 
上面的緩存技術可以讓你很容易的緩存整個頁面如果要緩存指定控件的內容可以通過指定VaryByControl 屬性來完成 
復制代碼代碼如下:
%@OutputCacheDuration=""VaryByControl="MyControl_"% 
上面代碼ASPNET將會緩存MyControl_控件分鐘如果要根據一些屬性值來緩存控件只需要將OutPutCache指令加入*ascx頁面 
復制代碼代碼如下:
<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControlascxcs" 
Inherits="Controls_MyControl"%> 
<%@OutputCacheDuration=""VaryByControl="EmployeeID"%> 
VaryByControl=”EmployeeID”告訴ASPNET根據控件中聲明的EmployeeID屬性來創建不同版本的緩存 
ascxcs 文件加入EmplyeeID屬性為ASPNET 緩存使用 
在頁面中增加控件並且設置 EmployeeID 
復制代碼代碼如下:
private int_employeeID; 
public intEmployeeID 

get{ return_employeeID; } 
set{ _employeeID = value; } 

protected voidPage_Load(objectsender EventArgs e) 

lblDateText = DateTimeNowToShortDateString(); 
lblTimeText = DateTimeNowToLongTimeString(); 
lblEmployeeIDText = EmployeeIDToString(); 

緩存配置文件(Cache Profile ) 
webconfig可以配置緩存相關的設置 
復制代碼代碼如下:
<systemweb> 
<caching> 
<outputCacheSettings> 
<outputCacheProfiles> 
<addname="ProductItemCacheProfile" duration=""/> 
</outputCacheProfiles> 
</outputCacheSettings> 
</caching> 
</systemweb> 
你可以通過設置 CacheProfile=”ProfileName” 屬性 來使用上面的配置 
復制代碼代碼如下:
%@OutputCacheCacheProfile="ProductItemCacheProfile"VaryByParam="None"% 
數據緩存(Data Caching) 
ASPNET還提供了另一種靈活的緩存類型數據緩存你可以將一些耗費時間的條目加入到一個對象緩存集合中以鍵值的方式存儲 
復制代碼代碼如下:
Cache["Name"] = data; 

我們可以通過使用CacheInsert()方法來設置緩存的過期優先級依賴項等 
復制代碼代碼如下:
date = DateTimeNow;CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero); 

ASPNET允許你設置一個絕對過期時間或滑動過期時間但不能同時使用 
緩存依賴項Cache dependency 
緩存依賴項使緩存依賴於其他資源當依賴項更改時緩存條目項將自動從緩存中移除緩存依賴項可以是應用程序的 Cache 中的文件目錄或與其他對象的鍵如果文件或目錄更改緩存就會過期 
復制代碼代碼如下:
date = DateTimeNow; 
string[] cacheKeys = { "Date"}; 
CacheDependency cacheDepn = newCacheDependency(null cacheKeys); 
CacheInsert("Date" date cacheDepn); 

上面的例子“Date”緩存對象依賴“Date”緩存條目當 “Date” 對象過期後“Date” 將會自動過期CacheDependency(null cacheKeys)中的第一個參數為空是由於我們只監視緩存鍵的更改情況 
回調函數和緩存優先級(Callback Method and Cache Priority) 
ASPNET允許我們寫一個回調函數當緩存條目從緩存中移除的時候觸發還可以設置緩存條目的優先級 
復制代碼代碼如下:
protected void Page_Load(object sender EventArgs e) 

DateTime? date = (DateTime?)Cache["Date"]; 
if (!dateHasValue) // date == null 

date = DateTimeNow; 
CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero 
CacheItemPriorityDefault new CacheItemRemovedCallback(CachedItemRemoveCallBack)); 

DateTime? date = (DateTime?)Cache["Date"]; 
if (!dateHasValue) // date == null 

date = DateTimeNow; 
CacheInsert("Date" date null DateTimeNowAddSeconds() TimeSpanZero 
CacheItemPriorityDefault new CacheItemRemovedCallback(CachedItemRemoveCallBack)); 

// Set values in labels 
lblDateText = dateValueToShortDateString(); 
lblTimeText = dateValueToLongTimeString(); 
lblDateText = dateValueToShortDateString(); 
lblTimeText = dateValueToLongTimeString(); 

private void CachedItemRemoveCallBack(string key object value CacheItemRemovedReason reason) 

if (key == "Date" || key == "Date") 

CacheRemove("Date"); 
CacheRemove("Date"); 



例子中創建了“Date” 和 “Date”緩存“Date” 在秒後過期“Date”為但是由於我們注冊了移除的回調函數當“Date” 或 “Date”其中一個過期都會執行CachedItemRemoveCallBack 方法在這個方法中移除了兩個緩存條目ASPNET還提供了處理緩存條目更新時的回調函數CacheItemUpdateCallback  
原文


From:http://tw.wingwit.com/Article/program/net/201311/14318.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.