天天看點

ASP.NET緩存總結

一:ASP.NET中緩存分類,共3種

頁面輸出緩存、頁面片段緩存、頁面資料緩存

二:頁面輸出緩存

可以使用頁面輸出緩存來提高WEB站點的性能。可以緩存頁面的輸出并且把緩存起來的拷貝發送出去以響應浏覽器的請求,而不是每次在請求頁面時執行頁面。

例:你的站點包括一個從資料庫表檢索出來的顯示産品資訊的頁面。預設情況下,每次使用者通路産品頁面時,都必須執行該頁面并且從資料庫檢索資料。但如果啟用頁面輸出緩存,這個頁面就隻執行一次,并且隻從資料庫檢索一次資料。這就意味着減輕了WEB應用程式和資料庫伺服器的負載。

要啟用頁面輸出緩存,在頁面中包括如下頁面處理指令即可:

<%@ OutputCache Duration="60" VaryByParam="none" %>

如下例:

<%@ Page Language="C#" %>

<%@ OutputCache Duration="300" VaryByParam="none" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<script language="C#" runat="server">

void Page_Load(Object sender , EventArgs e)

{

SqlConnection conNorthwind;

string strSelect;

SqlCommand cmdSelect;

SqlDataReader dtrProducts;

conNorthwind = new SqlConnection( @"Server=localhost;Integrated Security=SSPI;Database=Northwind" );

strSelect = "Select * From Products Where ProductID=1";

cmdSelect = new SqlCommand( strSelect, conNorthwind );

conNorthwind.Open();

dgrdProducts.DataSource = cmdSelect.ExecuteReader( CommandBehavior.SingleRow );

dgrdProducts.DataBind();

conNorthwind.Close();

string strTime = DateTime.Now.ToString();

lblMessage.Text = strTime;

}

</script>

<html>

<head><title>ProductPage.aspx</title></head>

<body>

<asp:DataGrid

ID="dgrdProducts"

CellPadding="10"

Runat="Server" />

<hr>

<small>Last Updated: <asp:Label

ID="lblMessage"

Font-Bold="True"

ForeColor="Blue"

Runat="Server" /></small>

</body>

</html>

此例中顯示了從Northwind資料庫檢索到的特定産品資訊,這個頁面被緩存5分鐘。

注:不能保證緩存的項總會保留在頁面的輸出緩存中。如果系統資源不足,ASP.NET架構會開始從緩存中清理緩存項。

屬性Duration表示緩存的時間,以秒為機關。

屬性VaryByParam表示對一個頁面請求中包含參數(查詢字元串參數或表單域參數)時頁面該如何被緩存。這個屬性可以接受分号作為分隔符的參數清單,或者是如下兩個特殊值:

none------表示即使頁面被請求時帶不同的參數,也不會建立頁面不同的緩存版本。

*-----------表示在頁面被請求時帶有不同的參數,則建立頁面不同的緩存本。

<a href="http://localhost/p.aspx?pid=5">http://localhost/p.aspx?pid=5</a>

&lt;%@ OutputCache Duration="300" VaryByParam="pid" %&gt;

這條指令根據查詢字元串參數pid的值來緩存頁面的不同版本。如果以pid為4來請求這個頁面,然後又以pid為5來請求這個頁面,那麼就儲存了該頁面的不同緩存版本。

設定緩存的位置---屬性Location(取來自OutputCacheLocation枚舉類型的一個值):

Any---預設值。頁面可在任何地方緩存,包括伺服器、下遊伺服器、浏覽器。

Client---頁面的輸出隻在浏覽器緩存。

DownStream----頁面的輸出隻在下遊伺服器上緩存。

None----不執行頁面緩存操作。

Server----頁面隻在伺服器端緩存。

使用HttpCachePolicy類--精确控制頁面的緩存行為

其中SetExpires()方法表示頁面過期的日期,SetCacheability()方法表示頁面要如何來緩存。SetCachability()方法取HttpCacheability枚舉類型中的值:

NoCache---防止任何頁面用Cache-Control:no-cache頭來緩存。

Private--表示頁面不應當被代理伺服器來緩存,但可以被浏覽器緩存。預設值。

Public--表示頁面可以被浏覽器和代理伺服器緩存。

Server--表示頁面隻可以在伺服器端被緩存。

三:使用頁面片段緩存

頁面片段緩存是通過使用者服務控件來實作的。通過為頁面的每個區域建立一個單獨的使用者控件,就可以定義頁面的不同區域。在每個使用者控件中,可以使用OutputCache指令來表示如何緩存控件的輸出。

注意:

在預設情況下,每個使用者控件的輸出都被單獨緩存起來,如果要跨多個使用者控件共享同樣的輸出緩存,以節省内在開銷,那麼可以使用Shared屬性

&lt;%@ OutputCache Duration="60" VaryByParam="*" Shared="true" %&gt;

頁面片段緩存的限制:

由于控件被緩存了,就不能在頁面中程式設計設定使用者控件的屬性;也不能對被緩存的使用者控件使用資料綁定的文法。

四:使用頁面資料緩存

每個ASP.NET應用程式都有一個Cache對象,直到應用程式重新啟動之前該對象一直可用。

Cache.Insert("t1", "goodtyl");//新增項

Cache.Insert("t2", "weiwei");

Cache.Insert("t3", "haha");

Cache.Remove("t3");//移除項

//周遊Cache,注意System.Collections.DictionaryEntry:定義可設定或可檢索的字典鍵/值對

foreach(DictionaryEntry temp in Cache)

Response.Write("key: " + temp.Key.ToString() + "value: " + temp.Value.ToString() + "&lt;br&gt;");

添加緩存檔案依賴:在添加一個檔案依賴時,可以把該項與一個檔案相關聯。如果檔案發生改變,就自動從緩存中删除該項。如例:Cache.Insert("mi","hello",new System.Web.Caching.CacheDependency(MapPath("a.txt")));如果a.txt被修改了,那麼,mi就自動從緩存中删除。

添加緩存觸發依賴:隻要資料庫表的記錄發生改變就更新緩存中的一項。

需要使用sqlserver觸發器及xp_cmdshell擴充存儲過程。

CREATE TRIGGER UpdateCache

ON Products

FOR UPDATE, DELETE, INSERT

AS

DECLARE @cmd Varchar( 200 )

SELECT @cmd = 'echo ' + Cast( getDATE() As Varchar( 50 ) ) +

' &gt; c:\tableChange.txt'

EXEC master..xp_cmdshell @cmd, no_output

代碼:

DataSet dstProducts = (DataSet)(Cache[ "productsDS" ]);

if ( dstProducts == null )

dstProducts = GetProducts();

Cache.Insert( "Products", dstProducts, new CacheDependency( "c:\\tableChange.txt" ) );

dgrdProducts.DataSource = dstProducts;

DataSet GetProducts() {

SqlDataAdapter dadProducts;

DataSet dstProducts;

strSelect = "Select TOP 20 * From Products ORDER BY ProductID";

dadProducts = new SqlDataAdapter( strSelect, conNorthwind );

dstProducts = new DataSet();

dadProducts.Fill( dstProducts, "ProductsDS" );

return dstProducts;

&lt;head&gt;&lt;title&gt;DatabaseDependency.aspx&lt;/title&gt;

&lt;/head&gt;

添加緩存鍵依賴:

void UpdateItem1( object s, EventArgs e )

Cache[ "item1" ] = txtNewValue.Text;

void UpdateItem2( object s, EventArgs e )

string arrKeyDepends = ( "item1" );

Cache.Insert( "item2", txtNewValue.Text, new CacheDependency( Server.MapPath(arrKeyDepends), System.DateTime.Now ) );

&lt;head&gt;&lt;title&gt;KeyDependency.aspx&lt;/title&gt;&lt;/head&gt;

&lt;form Runat="Server"&gt;

&lt;asp:TextBox

ID="txtNewValue"

&lt;p&gt;

&lt;asp:Button

Text="Update Item1"

OnClick="UpdateItem1"

Text="Update Item2"

OnClick="UpdateItem2"

Item1 = &lt;%=Cache[ "item1" ]%&gt;

&lt;br&gt;

Item2 = &lt;%=Cache[ "item2" ]%&gt;

&lt;/form&gt;

建立一個絕對過期政策:

Cache.Insert("Time", strTime, null, DateTime.Now.AddMinutes( 1 ), Cache.NoSlidingExpiration );

建立相對過期政策:

Cache.Insert("Time", strTime, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes( 1 ) );

設定緩存項的優先級:

Cache.Insert("my","hello",null,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.High,null);

建立緩存回調方法:在插入一個項到緩存時,可以把一個回調方法與這個項關聯起來。無論是何種原因,隻要該項從緩存中删除,那麼回調方法就自動執行。

最明顯的回調應用是當一個項過期時自動把該項重新加載到緩存中。

示例代碼:

public static CacheItemRemovedCallback onRemove;

//CacheItemRemovedReason表示從緩存中删除項的原因

void ItemRemoved( string strItemKey, object objItemValue, CacheItemRemovedReason objRemovedReason )

string strLogEntry;

strLogEntry = "Item with value " + objItemValue.ToString() ;

strLogEntry = " removed at " + System.DateTime.Now.ToString( "T" );

strLogEntry = " because of " + objRemovedReason.ToString();

if ( Application[ "CacheLog" ] == null )

Application[ "CacheLog" ] = new ArrayList();

//Application[ "CacheLog" ].Add( "strLogEntry" );

//Beep();

void btnAddCache_Click( object s, EventArgs e )

onRemove = new CacheItemRemovedCallback( ItemRemoved );

Cache.Insert( "myItem", txtNewValue.Text, null, DateTime.Now.AddSeconds( 10 ), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove );

void btnRemoveCache_Click( object s, EventArgs e )

Cache.Remove( "myItem" );

void Page_PreRender( object s, EventArgs e )

dgrdCacheLog.DataSource = Application[ "CacheLog" ];

dgrdCacheLog.DataBind();

&lt;head&gt;&lt;title&gt;CacheCallback.aspx&lt;/title&gt;&lt;/head&gt;

&lt;h2&gt;Cache Log&lt;/h2&gt;

ID="dgrdCacheLog"

CellPadding="8"

id="txtNewValue"

id="btnAddCache"

Text="Add To Cache!"

OnClick="btnAddCache_Click"

id="btnRemoveCache"

Text="Remove From Cache!"

OnClick="btnRemoveCache_Click"

Text="Refresh Page!"

from:

<a href="http://hi.baidu.com/cucugo/blog/item/6615798b23630e1ac8fc7ae4.html">http://hi.baidu.com/cucugo/blog/item/6615798b23630e1ac8fc7ae4.html</a>

本文轉自94cool部落格園部落格,原文連結:http://www.cnblogs.com/94cool/articles/1524541.html,如需轉載請自行聯系原作者