【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式
有時緩存整個頁面是不現(xiàn)實的,因為頁的某些部分可能在每次請求時都需要變化。在這些情況下,只能緩存頁的一部分。顧名思義,頁面部分緩存是將頁面部分內(nèi)容保存在內(nèi)存中以便響應(yīng)用戶請求,而頁面其他部分內(nèi)容則為動態(tài)內(nèi)容。頁面部分緩存的實現(xiàn)包括兩種方式:
??? 控件緩存(通過使用控件嵌套的方式來實現(xiàn)緩存部分頁面) 。
??? 替換后緩存(通過緩存整個頁面,替換部分頁面組件的方式來實現(xiàn)部分緩存)。
1. 控件緩存(也稱為片段緩存):
這種方式允許將需要緩存的信息包含在一個用戶控件內(nèi),然后,將該用戶控件標(biāo)記為可緩存的,以此來緩存頁面輸出的部分內(nèi)容。該選項允許緩存頁面中的特定內(nèi)容,而沒有緩存整個頁面,因此,每次都需重新創(chuàng)建整個頁。例如,如果要創(chuàng)建一個顯示大量動態(tài)內(nèi)容(如股票信息)的頁,其中有些部分為靜態(tài)內(nèi)容(如每周總結(jié)),這時可以將靜態(tài)部分放在用戶控件中,并允許緩存這些內(nèi)容。
在ASP.NET中,提供了UserControl這種用戶控件的功能。一個頁面可以通過多個UserControl來組成。只需要在某個或某幾個UserControl里設(shè)置緩存。
例如:
那么可以在WebUserControl1.ascx的頁頭代碼中添加聲明語句:
<%@
Control Language="C#" AutoEventWireup="true"
CodeBehind="WebUserControl1.ascx.cs"
Inherits="CacheWebApp._16_4_5.WebUserControl1" %>
<%@ OutputCache? Duration="60" VaryByParam="none" %>
<%=DateTime.Now %>
調(diào)用該控件的頁面WebForm1.aspx代碼:
<%@ Page Language="C#"
AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm1" %>
<%@ Register
src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1"
%>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>控件緩存</title>
</head>
<body>
<form
id="form1" runat="server">
<div>
頁面的:<%=DateTime.Now
%>
</div>
<div>
控件的:<uc1:WebUserControl1
ID="WebUserControl11" runat="server"
/>
</div>
</form>
</body>
</html>
這時候刷新WebForm1.aspx頁面時,頁面的時間每次刷新都變化,而用戶控件中的時間數(shù)據(jù)卻是60秒才變化一次,說明對頁面的“局部”控件實現(xiàn)了緩存,而整個頁面不受影響。
-------------------------------------------------------------------------------------------------------
2. 緩存后替換:
與控件緩存正好相反。它對整個頁面進行緩存,但是頁中的某些片段是動態(tài)的,因此不會緩存這些片段。ASP.NET頁面中既包含靜態(tài)內(nèi)容,又包含基于數(shù)據(jù)庫數(shù)據(jù)的動態(tài)內(nèi)容。靜態(tài)內(nèi)容通常不會發(fā)生變化。因此,對靜態(tài)內(nèi)容實現(xiàn)數(shù)據(jù)緩存是非常必要的。然而,那些基于數(shù)據(jù)的動態(tài)內(nèi)容,則不同。數(shù)據(jù)庫中的數(shù)據(jù)可能每時每刻都發(fā)生變化,因此,如果對動態(tài)內(nèi)容也實現(xiàn)緩存,可能造成數(shù)據(jù)不能及時更新的問題。對此問題如果使用前文所述的控件緩存方法,顯然不切實際,而且實現(xiàn)起來很繁瑣,易于發(fā)生錯誤。
如何實現(xiàn)緩存頁面的大部分內(nèi)容,而不緩存頁面中的局部某些片段。ASP.NET
2.0提供了緩存后替換功能。實現(xiàn)該項功能可通過以下三種方法:
一是以聲明方式使用Substitution控件,
二是以編程方式使用Substitution控件API,
三是以隱式方式使用控件。
前兩種方法的核心是Substitution控件,本節(jié)將重點介紹該控件,第三種方法僅專注于控件內(nèi)置支持的緩存后替換功能,本節(jié)僅做簡要說明。
(1)
Substitution控件應(yīng)用
為提高應(yīng)用程序性能,可能會緩存整個ASP.NET頁面,同時,可能需要根據(jù)每個請求來更新頁面上特定的部分。例如,可能要緩存頁面的很大一部分,需要動態(tài)更新該頁上與時間或者用戶高度相關(guān)的信息。在這種情況下,推薦使用Substitution控件。Substitution控件能夠指定頁面輸出緩存中需要以動態(tài)內(nèi)容替換該控件的部分,即允許對整頁面進行輸出緩存,然后,使用Substitution控件指定頁中免于緩存的部分。需要緩存的區(qū)域只執(zhí)行一次,然后從緩存讀取,直至該緩存項到期或被清除。動態(tài)區(qū)域,也就是Substitution控件指定的部分,在每次請求頁面時都執(zhí)行。Substitution控件提供了一種緩存部分頁面的簡化解決方案。
<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm2" %>
<%@ OutputCache
Duration="60" VaryByParam="none" %>
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>緩存后替換示例</title>
</head>
<body>
<form
id="form1" runat="server">
<div>
頁面緩存的時間:<%=
DateTime.Now.ToString() %>
</div>
<div>
真實(替換)的時間:<asp:Substitution ID="Substitution1" runat="server"
MethodName="getCurrentTime"
/>
</div>
</form>
</body>
</html>
頁面后臺代碼:
public
partial class WebForm2 : System.Web.UI.Page
{
public static string
getCurrentTime(HttpContext context)
{
return
DateTime.Now.ToString();
}
}
如上代碼所示,Substitution控件有一個重要屬性:MethodName。該屬性用于獲取或者設(shè)置當(dāng)Substitution控件執(zhí)行時為回調(diào)而調(diào)用的方法名稱。該方法比較特殊,必須符合以下3條標(biāo)準(zhǔn):
?
此方法必須被定義為靜態(tài)方法;
? 此方法必須接受HttpContext類型的參數(shù);
?
此方法必須返回String類型的值。
在運行情況下,Substitution控件將自動調(diào)用MethodName屬性所定義的方法。該方法返回的字符串即為要在頁面中的Substitution控件的位置上顯示的內(nèi)容。如果頁面設(shè)置了緩存全部輸出,那么在第一次請求時,該頁將運行并緩存其輸出。對于后續(xù)的請求,將通過緩存來完成,該頁上的其他代碼不會再運行。但Substitution控件及其有關(guān)方法則在每次請求時都執(zhí)行,并且自動更新該控件所表示的動態(tài)內(nèi)容,這樣就實現(xiàn)了整體緩存,局部變化的替換效果。
如上代碼所示,在代碼頭部通過@
OutputCache指令設(shè)置頁面輸出緩存過期時間為5秒,這意味著整個頁面數(shù)據(jù)都應(yīng)用了緩存功能。因此,“頁面緩存的時間”所顯示的時間值來自于數(shù)據(jù)緩存。這個時間值不會隨著刷新頁面而變化,僅當(dāng)緩存過期時才會發(fā)生更新。Substitution控件的MethodName屬性值為getCurrentTime。該控件顯示的內(nèi)容來自于getCurrentTime方法的返回值。尤為重要的是,雖然頁面設(shè)置了輸出緩存功能,但是每當(dāng)頁面刷新時,ASP.NET執(zhí)行引擎仍然要重新執(zhí)行Substitution控件,并將MethodName屬性值指定的方法返回值顯示在頁面上,因此,顯示的是當(dāng)前最新時間。
示例效果,如圖15-2所示:
圖15-2
緩存后替換
隨著頁面的刷新,真實時間在變,而頁面緩存的時間在指定的緩存時間內(nèi)始終不變。
注意:
l
Substitution控件無法訪問頁上的其他控件,也就是說,無法檢查或更改其他控件的值。但是,代碼確實可以使用傳遞給它的參數(shù)來訪問當(dāng)前頁上下文。
l
在緩存頁包含的用戶控件中可以包含Substitution控件。但是,在輸出緩存用戶控件中不能放置Substitution控件。
l
Substitution控件不會呈現(xiàn)任何標(biāo)記,其位置所顯示內(nèi)容完全取決于所定義方法的返回字符串。
(2)
Substitution控件API應(yīng)用
上一小節(jié)介紹了以聲明方式使用Substitution控件實現(xiàn)緩存后替換的應(yīng)用。本節(jié)說明另一種實現(xiàn)方法。該方法的核心是以編程方式利用Substitution控件API實現(xiàn)緩存后替換,相對于以聲明方式使用Substitution控件的方法具有更強靈活性。
通過為Substitution指定回調(diào)方法,實現(xiàn)和聲明同樣的效果。Substitution的回調(diào)方法必須是
HttpResponseSubstitutionCallback委托定義的方法,它有兩個特征:
l
一是返回值必須是String,
l
二是參數(shù)有且僅有一個,并且是HttpContext類型。
當(dāng)需要以編程方式,為緩存的輸出響應(yīng)動態(tài)生成指定的響應(yīng)區(qū)域時,可以在頁面代碼中將某個方法(即回調(diào)方法)的名稱作為參數(shù)(HttpResponseSubstitutionCallback)傳遞給Substitution。這樣Substitution就能夠使用回調(diào)方法,并將回調(diào)方法的返回值作為給定位置的替代內(nèi)容顯示出來。
需要注意的是,回調(diào)方法必須是線程安全的,可以是作為容器的頁面或者用戶控件中的靜態(tài)方法,也可以是其他任意對象上的靜態(tài)方法或?qū)嵗椒ā?br />
下面演示一個以編程方式將
Substitution
控件添加到輸出緩存網(wǎng)頁。與(1)Substitution控件應(yīng)用所示的示例完成同樣功能。不同的是實現(xiàn)方式。
<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm3" %>
<%@ OutputCache
Duration="60" VaryByParam="none" %>
<html
xmlns="http://www.w3.org/1999/xhtml">
<head
runat="server">
<title>緩存后替換-Substitution控件API應(yīng)用</title>
</head>
<body>
<form
id="form1" runat="server">
<div>
頁面緩存的時間:<asp:Label
ID="Label1" runat="server"
Text="Label"></asp:Label>
</div>
<div>
真實(緩存替換)的時間:
<asp:PlaceHolder
ID="PlaceHolder1"
runat="Server"></asp:PlaceHolder>
</div>
</form>
</body>
</html>
頁面后臺CS代碼:
protected void Page_Load(object sender, EventArgs
e)
{
//創(chuàng)建一個Substitution
Substitution Substitution1 = new
Substitution();
//指定調(diào)用的回調(diào)方法名
Substitution1.MethodName =
"GetCurrentDateTime";
PlaceHolder1.Controls.Add(Substitution1);
Label1.Text=DateTime.Now.ToString();
}
public
static string GetCurrentDateTime(HttpContext context)
{
return
DateTime.Now.ToString();
}
如上代碼所示,頁面使用@
OutputCache指令設(shè)置了輸出緩存功能,其配置數(shù)據(jù)緩存過期時間為60秒。然而,頁面其他內(nèi)容都被緩存,通過Substitution調(diào)用的回調(diào)方法顯示的內(nèi)容是不被緩存的。
?
引用地址:http://hi.baidu.com/jiangyangw3r/item/e2cad6d0a9eb2ee6b2f77769
轉(zhuǎn)載于:https://www.cnblogs.com/sishierfei/archive/2012/07/13/2590513.html
總結(jié)
以上是生活随笔為你收集整理的【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页乱码解决小心得
- 下一篇: 虚拟机安装苹果系统(Mac OSX 10