asp.net 緩存研究

最近因項目要求,需要研究asp.net緩存,可是查閱了書本,msdn,網上後有點失望,真是天下文章一大抄啊,大家

講來講去都是那麼幾點,沒有條理,沒有重點,也沒有心得,所以我決定自己來寫一篇,當然,我是沒有能力來改變

這一現象的,只是寫來自己備忘罷了。

 

首先有幾點要說明:
1.個人認爲緩存只有兩種:頁輸出緩存與應用程序數據緩存。一般大家也是這麼認爲的,但是有另外一部份人卻把

這兩個部份分了又分,搞出三五種出來。這就讓人感覺很多餘了。
2.所謂控件緩存,其實是用戶控件緩存。可能是我理解有問題,我一開始還以爲那種html控件,web控件也可以進行

緩存的。所以說定義名稱要定義清楚。
3.實現緩存有兩種方式:在aspx頁面的頂部寫頁處理指令或者在cs代碼裏寫代碼(又叫緩存API),一種是靜態設置

,一各是動態設置。網上總有些人喜歡說來說去又不總結清楚,搞的人很煩。
4.實際上只要用到了緩存就一定有緩存依賴。只是有些不那麼明顯。在我看的文章裏一般都把緩存依賴單獨作爲一

章講解,這是好事,因爲在緩存的高級技術裏緩存依賴是很重要的,但這並不代表有些緩存就沒有緩存依賴。

 

 

好了,下面言歸正傳。我只講常用的東東。

 

1.頁面輸出緩存。其實用戶控件緩存跟它沒有大的區別,只有一個location不能使用,在這裏就一併講了吧。
page指令:
<%@ OutputCache Duration="10" VaryByParam="*" VaryByControl="txtInput" %>
OutputCache是指令名。
Duration是緩存時長,單位是秒。
VaryByParam是跟據什麼進行緩存。有兩個特殊的值:none表示不隨任何參數的不同而緩存,就是隻緩存一個版本,*

表示隨任何參數的不同而緩存,表示只要參數發生變化,就緩存一個新版本。
VaryByControl是跟據控件名進行緩存。這裏的控件是指一般的服務器控件,不能是用戶控件,不然會出現意想不到

的結果。

 

緩存API:
雖然頁面輸出緩存與用戶控件緩存在頁面指令方面差不多,但在api上面有所區別


頁面緩存api:
映射的是System.Web.HttpCachePolicy類。
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(3));

第一句對應的是Location,是說緩存在哪,public是哪裏都緩存,nocache是都不緩存,private是客戶端緩存,還有

其它幾個選項。比較關注的是:客戶端,代理服務器,服務器。
第二句對應的是Duration,是說緩存時長,這是個絕對時間,是說到了那個時就是取消緩存。
Response.Cache.VaryByParams["none"] = true;
對應的是VaryByParam
用中括號括起參數,中間可用分號分隔多個參數,true表示啓用此參數。

沒有對應VaryByControl的。

Response.Cache.SetSlidingExpiration(true);
當用了這一句的時候,所有緩存設置都不啓作用了,原因是這個屬性是用給代理服務器之類的處於瀏覽器和Web服務

器之間的緩存使用的,而不是給Web服務器本身的.是特意設計成這樣的.

Response.Cache.SetNoServerCaching()
表示取消當前所有服務器緩存。

 

用戶控件緩存api:


PartialCachingAttribute類,這是第一種方式
用戶控件也可以通過標明類屬性的方式完成緩存設置
在用戶控件的後臺代碼類上面加上:
[PartialCaching(int duration)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, bool

shared)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, string

sqlDependency, bool shared)]
在這裏的設置duration之類的與在page指令中投置duration之類的效果一樣


ControlCachePolicy類,這是第二種方式
在使用這種方式之前,必須保證用戶控件已使用page指令或PartialCachingAttribute類進行了封裝,否則會報異常


這個類是在動態加載用戶控件時使用的,沒有使用緩存時的加載具體請參看我的另外一篇文章:如何以編程方式加載用戶控件
PartialCachingControl my = (PartialCachingControl)LoadControl("usercon.ascx");
ControlCachePolicy cache = my.CachePolicy;
cache.Duration = TimeSpan.FromSeconds(3);
Controls.Add(my);
第一句是動態加載此用戶控件,當用戶控件啓動緩存後,asp.net會將其嵌入在PartialCachingControl類中,所以必

須強轉成PartialCachingControl。
第二句是獲取PartialCachingControl的CachePolicy屬性,是ControlCachePolicy類型,真正操作緩存的是這個類。
第三句是設置過期時間,沒什麼好說的
第四句是將動態生成的用戶控件加入到主目錄控件樹中,沒什麼好說的。
我在這裏只用了一個方法,其實它有很多方法,只要是在page指令裏能設置的這裏都可以進行設置。

 

在web.config中配置緩存

如果很多頁面或用戶控件使用相同的配置,則可以在web.config中進行配置後在page指令中統一調用。

在web.config中:

<caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="a" duration="3" varyByParam="none"/>
        </outputCacheProfiles>
      </outputCacheSettings>
</caching>

在page指令中:

<%@ OutputCache CacheProfile="a" %>

 

綜上所述:
對於頁面輸出緩存,用page指令來完成靜態設置,用System.Web.HttpCachePolicy類來完成動態設置
對於用戶控件緩存,用page指令或PartialCachingAttribute類來完成靜態設置,用ControlCachePolicy類來完成動

態設置。


以上所說的都是對整體的緩存,頁面是一個整體,用戶控件相對來說也是一個整體,下面要說的是另外一種思路,

2.0新增的:整體緩存,部分替換,也就是說,只對頁面或者用戶控件的一部份進行更新。

 

有兩種方式:一種是使用控件,一種是控件api


使用substitution控件
從工具欄拖一個這樣的控件就可以了。它只有一個methodname屬性。該屬性用於獲取或者設置此控件相關聯的回調函

數名稱。此函數必須符合以下3個條件:
靜態方法
參數類型爲httpcontext
返回string類型的值

例如:在一個啓用的輸出緩存的頁面上使用這個控件:
<asp:Substitution ID="subText" runat="server" MethodName="GetData" />
然後在後臺寫下這樣的代碼:
public static string GetData(HttpContext context)
{

            return DateTime.Now.ToString();
}
這樣頁面其它部分會進行緩存,但是這個地方會不停的打印新的時間。

注意:
substitution控件無法訪問頁面內的其它控件,只能使用傳遞給它的參數來訪問當前頁的上下文。
用戶控件不能使用此控件
此控件不能包含或自己呈現任何標記,顯示內容完全取決於方法的返回字符串。

 

使用控件api
主要就是Response.WriteSubstitution(getData)方法
它會將實時生成結果直接顯示在頁面最頂端,裏面那個方法名就是與上面所寫的方法一致就行了。而且用戶控件可以

使用此方法。

使用WriteSubstitution()方法有兩個好處。
第一,WriteSubstitution()方法引用的方法並不一定是當前類的方法。該方法可以是另一個實例或者另一個類的靜

態方法。
第二個好處是,可以在自定義控件中使用WriteSubstitution()方法來實現緩存後替換。

 

2。應用程序緩存
此部分內容請參看我的另外一篇文章:asp.net 的狀態管理與cache,在這篇文章裏我將應用程序緩存與緩存依賴一併講了。

 

參考文章
ASP.NET緩存:方法和最佳實踐
http://blog.csdn.net/jelink/archive/2006/09/11/1210241.aspx
ASP.NET緩存的SetSlidingExpiration
http://space.cnblogs.com/question/879/
即使 SetSlidingExpiration 方法設置爲,也會收到新網頁而不是緩存的網頁的滿足運行.NET Framework 2.0 的計

算機上
http://support.microsoft.com/kb/909643/zh-cn
ASP.NET 2.0的頁面緩存功能介紹
http://dev.yesky.com/msdn/498/2442998_1.shtml
4.3  使用部分頁面緩存
http://book.csdn.net/bookfiles/1002/100100230727.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章