1.頁(yè)面緩存:
頁(yè)面輸出緩存用于緩存頁(yè)面呈現的所有內容(當在瀏覽器中選擇查看源碼能看的所有內容)到內存中.
注:頁(yè)面輸出緩存作用于整個(gè)頁(yè)面.
1.1部分頁(yè)面緩存通過(guò)只緩存頁(yè)面上的一個(gè)特定區域來(lái)解決這個(gè)問(wèn)題.利用部分頁(yè)面緩存,可以對頁(yè)面的不同區域應用
不同的緩存策略.
1.2當一個(gè)頁(yè)面被緩存時(shí),被請求時(shí)的頁(yè)面內容并不會(huì )每次都重新生成.每次請求一個(gè)頁(yè)面,對應到頁(yè)面的.NET類(lèi)也不會(huì )
執行.對于每一個(gè)請求頁(yè)面的用戶(hù),頁(yè)面呈現的內容都會(huì )緩存.
((((((((((((((((((((((((((((((((((((((((((((((((
緩存的存放的位置:
頁(yè)面可在多個(gè)位置緩存.而默認情況下,頁(yè)面可能緩存在瀏覽器,任意的代理服務(wù)器端以及Web服務(wù)器.
(注:當代理服務(wù)器端或瀏覽器緩存頁(yè)面時(shí),它們總是緩存整個(gè)頁(yè)面.)
也可以在OutputCache的Location屬性來(lái)設置緩存存放位置。Any,Client,DownStream,None,ServerAndClient.
))))))))))))))))))))))))))))))))))))))))))))))))
1.3緩存之基于自定義函數變化的輸出緩存
VaryByCustom可以給它指定一個(gè)自定義函數來(lái)決定何時(shí)生成不同的頁(yè)面緩存版本.
可以在Global.asax全局程序類(lèi)文件中重寫(xiě)GetVaryByCustomString()方法來(lái)創(chuàng )建自定義函數.
即根據GetVaryByCustomString()方法返回的string生成相應此string的頁(yè)面緩存版本.
1.4創(chuàng )建頁(yè)面輸出緩存文件依賴(lài)
即可以在一個(gè)緩存頁(yè)面和硬盤(pán)上的一個(gè)文件(或一組文件)之間創(chuàng )建一個(gè)依賴(lài)。當文件修改時(shí)緩存頁(yè)面自動(dòng)失效
并重新在下次頁(yè)面請求時(shí)生成。
1.5使用編程方式設置輸出緩存過(guò)期
使用Response.RemoveOutputCacheItem()方法,只接受一個(gè)“虛擬絕對”路徑,即要用Page.ResoveUrl()方法來(lái)
轉換~符號為應用程序的根路徑。





1.6若要刪除多個(gè)頁(yè)面,需要創(chuàng )建一個(gè)所謂的鍵依賴(lài)(Key dependency)。一個(gè)鍵依賴(lài)用于在緩存中的項目之間建立依賴(lài)。當第二個(gè)項目移除時(shí),第一個(gè)項目也會(huì )被自動(dòng)移除。
先插入Cache.Insert("Movies", DateTime.Now);
Response.AddCacheItemDependency("Movies");
再在另一個(gè)頁(yè)面
Cache.Remove("Movies");
Response.Redirect("~/實(shí)現使用編程方式設置頁(yè)面輸出緩存過(guò)期/MovieListKeyDependency.aspx");
*****************************************************************************************
上面介紹的是頁(yè)面的全部緩存輸出
下面介紹的是使用部分頁(yè)面緩存
*****************************************************************************************
2使用緩存后替換有兩種方式:
2.1聲明方式一定要使用Substitution控件
Substitution 控件指定輸出緩存的網(wǎng)頁(yè)上不進(jìn)行緩存的部分。使用 Substitution 控件可以在輸出緩存的網(wǎng)頁(yè)上指定希望用動(dòng)態(tài)內容 替換控件的部分。
Substitution 控件將動(dòng)態(tài)內容插入到緩存頁(yè)中。Substitution 控件不會(huì )呈現任何標記。您需要將該控件綁定到頁(yè)上或父用戶(hù)控件上 的方法中。您要自行創(chuàng )建靜態(tài)方法,以返回要插入到頁(yè)中的任何信息。由 Substitution 控件調用的方法必須符合下面的標準:
此方法被定義為靜態(tài)方法(在 Visual Basic 中為共享方法)。
此方法接受 HttpContext 類(lèi)型的參數。
此方法返回 String 類(lèi)型的值。
即此方法的簽名為:public static string MethodName(HttpContext context){}
(注:Substitution的屬性MethodName返回的string可以支持Html編碼哦。)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/fd47d5f3-1ede-4096-96eb-8d9c96012451.htm
2.2.可用編程方式Response.WriteSubstitution()
Substitution控件的時(shí)間是:
<% Response.WriteSubstitution(GetTime);%>
2.3使用用戶(hù)控件緩存(緩存后替換只在處理字符串文本和HTML時(shí)比較合適,若望處理更復雜的部分頁(yè)面緩存,則應該利用用戶(hù)控件)
<%@ Control Language="C#" ClassName="Movies" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
用戶(hù)控件時(shí)間:<%= DateTime.Now.ToString("T") %><hr />
<asp:GridView ID="grdMovies" DataSourceID="srcMovies" runat="server" />
<asp:SqlDataSource ID="srcMovies" ConnectionString="<%$ ConnectionStrings:Movies %>" SelectCommand="SELECT Title,Director FROM Movies" runat="server" />
(注:用戶(hù)控件中的OutputCache有個(gè)Shared屬性,若設為true則此用戶(hù)在多個(gè)頁(yè)面中使用時(shí),都是只緩存一個(gè)頁(yè)面版本.)
用編程方式處理用戶(hù)控件緩存
















************************************************************************************
4.使用DataSource緩存(即可以設置DataSource屬性來(lái)實(shí)現)
4.1使用數據源控件緩存的一個(gè)好處是數據源控件可以在數據更新時(shí)自動(dòng)重新載入數據,且可以在多個(gè)頁(yè)面間共享相同的數據.




4.2使用Sliding緩存過(guò)期策略
需要緩存大量數據,則使用sliding過(guò)期策略比絕對緩存過(guò)期策略要更合理.當使用sliding緩存過(guò)期策略時(shí),除非數據在指定時(shí)間段內
再次被請求訪(fǎng)問(wèn),否則緩存就會(huì )丟失.(也就是說(shuō)用戶(hù)不停的訪(fǎng)問(wèn)時(shí),其過(guò)期間隔還是這么多)





(小技巧:檢測電影的緩存是否失效可實(shí)現SqlDataSource數據源控件的Selecting事件,因此事件是在從數據庫獲得電影時(shí)被調用,若從內存中獲得時(shí)不會(huì )被調用.)
4.3其實(shí)ObjectDataSource控件與SqlDataSource控件一樣的緩存屬性.
5.使用數據緩存
在內部,Asp.Net Framework包含的所有不同的緩存機制都使用了Cache對象.也就是說(shuō),Cache對象是Asp.Net中所有緩存的根本機制.
對于每一個(gè)Asp.Net應用程序,都會(huì )創(chuàng )建了個(gè)Cache對象的實(shí)例.添加到緩存中的任何項目都能被其他頁(yè)面,控件或包含在相同的應用程序(虛擬目錄)中的組件訪(fǎng)問(wèn).
5.1使用緩存API
即Cache對象,其有屬性及相應的方法。
6.使用SQL緩存依賴(lài)(就象trigger一樣,數據庫一更新就把緩存給更新)
ASP.NET2.0 Framework新增的一個(gè)非常強大的功能是SQL緩存依賴(lài).該功能允許在指定的數據庫數據修改時(shí),自動(dòng)地重新載入緩存的數據.
ASP.NET Framework支持的SQL緩存依賴(lài)使得使用緩存時(shí)可以充分利用緩存,并陳舊數據最少.當使用SQL緩存依賴(lài)時(shí),可以自動(dòng)監測指定數據庫中的數據是否變更,并刷新緩存中的數據.
6.1使用拉SQL緩存依賴(lài)
拉SQL緩存依賴(lài)是最靈活的SQL緩存依賴(lài)類(lèi)型,所以對大多數應用程序來(lái)說(shuō),推薦使用拉類(lèi)型SQL緩存依賴(lài)可以使用拉SQL緩存依賴(lài)來(lái)檢測數據庫表的修改.
拉SQL緩存依賴(lài)就是:使用數據庫trigger.當表被修改時(shí),trigger被觸發(fā),名為AspNet_SqlCacheTablesForChangeNotification的數據表的一行數據將被更新,來(lái)記錄被修改的情況.
具體內部運行是:ASP.MET Framework使用一個(gè)后臺線(xiàn)程,來(lái)定期拉數據庫表的修改信息.如果有修改,則依賴(lài)于數據表的緩存項目從緩存中移除.
6.2配置拉SQL緩存依賴(lài)
在使用拉SQL緩存依賴(lài)之前,必須執行下面兩步驟:
1).必須對一個(gè)或多個(gè)數據庫表啟用SQL緩存依賴(lài).
6.2.1.1執行下面的命令可啟用test數據庫的SQL緩存依賴(lài):
aspnet_regsql -C "Data Source=localhost;Integrated Security=True;Initial Catalog=test" -ed
或
aspnet_regsql -C "Server=.;Integrated Security=True;Database=pubs" -ed
(此命令將創(chuàng )建AspNet_SqlCacheTablesForChangeNotification數據表,并添加一組存儲過(guò)程到鏈接字符串指定的數據庫)
6.2.1.2啟用一個(gè)數據庫之后,就可以用如下命令啟用特定表的SQL緩存依賴(lài):(啟用tbTest數據表的SQL緩存依賴(lài))
aspnet_regsql -C "Data Source=localhost;Integrated Security=True;Initial Catalog=test" -et -t tbTest
或
aspnet_regsql -C "Server=localhost;Integrated Security=True;Database=pubs" -et -t authors
(此命令為pubs數據庫authors數據表的SQL緩存依賴(lài).它會(huì )給authors表創(chuàng )建一個(gè)新的trigger,并添加一行新記錄到
AspNet_SqlCacheTablesForChangeNotification表中)
2).必須在Web配置文件中配置SQL緩存依賴(lài).









3).最后應用是要在OutputCache的屬性SqlDependency設置如:SqlDependency="MyDatabase:Movies"









6.3使用推SQL緩存依賴(lài)
在使用MS SQL Server05時(shí),除了拉SQL緩存依賴(lài),還可以使用推SQL緩存依賴(lài).即MS SQL Server05包含一個(gè)名為查詢(xún)通知的功能,它在后臺使用MS SQL Server 05 的Service Broker.這個(gè)Service Broker可以在數據庫中的數據變更時(shí)自動(dòng)給應用程序發(fā)送一個(gè)消息.(即推SQL緩存依賴(lài)是數據庫有更改時(shí)就發(fā)消息通知應用程序,而拉SQL緩存依賴(lài)是應用程序在一段時(shí)間間隔里向數據庫的特殊表查看是否數據庫有沒(méi)改變).
(注:推SQL緩存依賴(lài)有諸多的限制如:查詢(xún)的表名要兩部分如dbo.Movies而不是Movies,等N多限制)
6.4配置推SQL緩存依賴(lài)
1).必須配置數據庫啟用SQL Server 2005 Service Broker.
6.4.1.1在MS sql server 05中隨便建立下列查詢(xún)來(lái)查看Service Broker是否已經(jīng)為特定的數據庫激活
select name,is_broker_enabled from sys.databases
6.4.1.2若Service Broker還沒(méi)有啟用,則要執行Alter Database命令來(lái)啟用它,如:
Alter Database TestDb Set Enable_Broker
6.4.1.3最后,Asp.Net進(jìn)程必須有足夠的權限來(lái)訂閱查詢(xún)通知.(當一個(gè)Asp.Net頁(yè)面由IIS處理,頁(yè)面在NETWORK SERVICE賬號 (WinServer03)或ASPNET賬號(對于其他系統,如Win XP)上下文中執行.
給test服務(wù)器上的本地ASPNET賬號賦予需要的權限:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "test\ASPNET"
2).必須配置應用程序開(kāi)始監聽(tīng)通知.
6.4.2.1在應用程序可以接收到變更通知之前,必須啟用查詢(xún)通知監聽(tīng)器.在Global.asax文件中啟用監聽(tīng)器:











//只需要在Web.config中添加個(gè)數據庫連接字符串即可
6.4.2.2最后使用推SQL緩存依賴(lài)實(shí)現對頁(yè)面輸出緩存(代碼如下所示:)


























SqlCacheDependency 類(lèi)監視輸出緩存所依賴(lài)的數據庫中的表,因此當更新表中的項時(shí),使用基于表的輪詢(xún)時(shí)將從緩存中移除這些項。將通知(在 Microsoft SQL Server 2005 中)與 CommandNotification 值一起使用時(shí),最終將使用 SqlDependency 類(lèi)向 SQL Server 2005 服務(wù)器注冊查詢(xún)通知。
注意
SqlDependency 屬性的 CommandNotification 值僅在網(wǎng)頁(yè) (.aspx) 中有效。用戶(hù)控件只能將基于表的輪詢(xún)用于 @ OutputCache 指令。
6.4.2.3對DataSource緩存使用推SQL緩存依賴(lài)(實(shí)例代碼:)

































6.4.2.3對數據緩存使用推SQL緩存依賴(lài)(實(shí)例:)
















































聯(lián)系客服