Asp.net 緩存技術總結
提高性能最好最快的辦法當然是通過緩存來改善,對於任何一個web開發者都應該善用緩存。Asp.net下的緩存機制十分強大,用好緩存機制可以讓我們極大的改善web應用的性能,下面是一些總結的緩存的知識點,與大家分享交流: 1.頁面緩存 要實現頁面輸出緩存,只要將一條 OutputCache 指令添加到頁面即可。
CacheProfile 用於定義與該頁關聯的緩存設置的名稱。是可選屬性,默認值為空字符("")。需要注意的是,包含在用戶控件中的@ OutputCache指令不支持此屬性。在頁面中指定此屬性時,屬性值必須與Web.config文件
指令。此指令包含一個Shared屬性,可設置共享用戶控件的輸出緩存。 以編程方式設置用戶控件緩存 當用戶控件中包括
指令時,可以通過用戶控件的CachePolicy屬性所暴露的ControlCachePolicy類的實例的屬性控制修改空間如何緩存。 創建用戶控件緩存的文件依賴 可以使用CacheControlPolicy.Dependency屬性在一個緩存了的用戶控件和文件系統中一個文件間創建一個依賴,示例代碼: PageLoad: CacheDependency depend=new CacheDependency(MapPath("~/test.xml")); this.CachePolicy.Dependency=depend; 緩存動態載入的用戶控件 可以使用Page.LoadControl()方法載入用戶控件,當具有緩存特性的用戶控件被載入時,Asp.net Framework自動一個PartialCachingControl類的實例包裝用戶控件。示例代碼: PageLoad: PartialCachingControl cacheme=(PartialCachingControl)Page.LoadControl("test.ascx"); Cacheme.CachePolicy.SetExpires(DateTime.Now.AddSeconds(10)); PlaceHolder1.Controls.Add(cacheme); Lable1.Text=cacheme.CachePolicy.Duration.ToString(); 3.使用DataSource緩存 SqlDataSource、ObjectDataSource、XmlDataSource控件都包括了用於緩存DataSource承載的屬性,好處是數據源控件可以在數據更新時自動重新載入數據。並且可以在多個頁面間共享相同的數據,通過一些屬性的組合來識別:SelectCommand、SelectParameters、ConnectionString。如果屬性相同,即共享相同的緩存數據。 通過設置屬性設置緩存過期策略 包括絕對緩存(EnableCaching="True" CacheDuration=「xxx」)和Sliding緩存(EnableCaching="True" CacheExpirationPolicy="Sliding" CacheDuration=「xxx」) 使用ObjectDataSource控件緩存 通過設置控件的EnableCaching、CacheExpirationPolicy、CacheDuration屬性以及SelectMethod所制定的方法名來完成。 使用XmlDataSource控件緩存 設置DataFile屬性創建一個文件依賴。 創建數據源控件鍵值依賴 操作步驟 1、設置數據源控件的CacheKeyDependency屬性(key); 2、在Global.asax創建初始化的(key)緩存項目。代碼如下: Void Application_Start(Object Sender,EventArgs e) { HttpContext context=HttpContext.Current; context.Cache.Insert( "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null ); } 3、在用於更改數據的頁面上移除緩存項目(key); 如在DetailsView控件的ItemInserted事件中重新插入緩存項目,此時每個依賴於這個鍵值(key)的DataSource會自動重新載入數據,代碼如下: protected void DetailsView_ItemInserted(object sender,DetailsViewInsertedEventArgs e) { Cache.Insert("key",Datetime.Now); } 註:以上key值採用當前時間並非必須。 4.Cache對像 幾乎可以給緩存添加任何對象,例如,可以添加自定義控件,DataSet,DataTable,ArrayList和List到緩存。注意:使用從緩存中返回的任何項目,應該總是要檢查項目是否為空,如果一個項目已經被刪除了,則當將來試圖從緩存中讀取時,就會返回null。 詳細信息查看msdnCache 成員 添加數據緩存到Cache對像示例代碼: void Page_Load() { DataTable dt=(DataTable)Cache["dtkey"]; if(dt==null) { dt=getdtFromDB(); //此處調用方法從數據庫中返回數據項DataTable Cache.Insert("dtKey",dt,null,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration); //此處使用絕對過期策略添加項目 } GridView1.DataSource=dt; GridView1.DataBind(); } private DataTable getdtFromDB() { //略...... } 使用依賴添加項目 Asp.net Framework包括三種緩存依賴 1、CacheDependency——用於創建一個文件依賴或緩存鍵值依賴。 2、SqlCacheDependency——用於創建一個對於Microsoft SQL Server數據庫表或SQL Server 2005數據庫查詢的依賴。 3、AggregateCacheDependency——用於使用多個CacheDependency對像創建依賴,例如,可以用該對像組合文件和Sql依賴。 CacheDependency類是基類,其他兩個類都是從該類繼承。 指定緩存項目優先級 可以指定CacheItemPriority枚舉類型任意值。 配置緩存 詳細信息查看Msdn Caching元素 5.使用SQL緩存依賴 Asp.net Framework支持兩種類型的SQL緩存依賴:拉和推。第一種模式使用表輪詢的 ASP.NET 實現,第二種模式使用 SQL Server 2005 的查詢通知功能。可以對任何最近版本的Ms SQL Server,包括Ms SQL server 2005 Express、Ms SQL Server 2000 和 Ms SQL Server 7.0,使用拉SQL緩存依賴。第二種類型推緩存依賴則只能用於Ms SQL Server 2005和Ms SQL server 2005 Express,因為他們依賴SQL Server的Service Broker。 使用拉SQL緩存依賴 實質上拉SQL緩存依賴使用數據庫tigger,當表被修改時,tigger被觸發,名為AspNet_SqlCacheTablesForChangeNotification的數據表的一行數據被更新,來記錄修改情況,Asp.net Framework使用一個後台線程,來定期拉數據表的修改信息。如果有修改,則依賴於數據表的緩存項目被移除。 配置拉SQL緩存依賴: 1、必須對一個或多個數據庫表啟用SQL緩存依賴。 可以使用框架中的SqlCacheDependencyAdmin類來配置SQL數據庫支持拉SQL緩存依賴,由於調用該類的方法需要創建表、存儲過程、trigger,出於安全考慮,Asp.net進程並不應該被賦予這些權限,而是通過一個命令行工具來使用此類。 aspnet_regsql 詳細信息訪問Msdn ASP.NET SQL Server 註冊工具 (Aspnet_regsql.exe) 簡要步驟: 1、啟用特定數據庫的SQL緩存依賴。 aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed 2、啟用特定表的SQL緩存依賴。 aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed -t Titles 2、必須在Web配置文件中配置SQL緩存依賴。
指令指定sqlDependency屬性值:庫名和表名(Mydatabase:Mytable); b、對DataSource控件使用拉SQL緩存依賴:為DataSource控件sqlDependency屬性指定值:庫名和表名(Mydatabase:Mytable); c、對Cache對像使用拉SQL緩存依賴: void Page_Load() { DataTable dt=(DataTable)Cache["dtkey"]; if(dt==null) { dt=getdtFromDB(); //此處調用方法從數據庫中返回數據項DataTable SqlCacheDependency sqlDepend=new SqlCacheDependecy("Mydatabase","Mytable"); Cache.Insert("dtKey",dt,sqlDepend); } GridView1.DataSource=dt; GridView1.DataBind(); } private DataTable getdtFromDB() { //略...... } 使用推SQL緩存依賴 通過Service Broker可以在數據庫中的數據變更時自動給應用程序發送一個消息。 好處:Asp.net應用程序不必定時拉數據庫的修改。 缺點:查詢類型有諸多限制(如必須使用兩部分的表明:abo.mytabel,查詢必須包含一個顯示的列名表明:不能使用*,不能引用視圖、臨時表等,不能包含子查詢、外連接、子連接,不能引用大對像、不能使用DISTINCT、COMPUTE、COMPUTE BY、INSERT關鍵字、不能包含許多聚合函數 等等) 1.為推SQL緩存依賴配置數據庫 啟用Ms SQL Server 2005 Service Broker: a、可以通過:Select name ,is_broker_enabled from sys_databases,查詢是否對特定的數據庫激活。 b、通過:Alter Database MyBase Set ENABLE_BROKER,啟用。 c、為本地AspNet帳號賦予需要的權限,如:Grant Subscribe Query Notifications To 「yourserver\Aspnet」 2.為推SQL緩存依賴配置應用程序 void Application_Start(object sender, EventArgs e) { string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString; SqlDependency.Start(conString); HttpContext context=HttpContext.Current; context.Cache.Insert( "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null ); } a、對頁面輸出緩存使用推SQL緩存依賴: 當緩存整個Asp.net頁面時,可以使用推Sql緩存依賴。如果包含在頁面上的任何Sql命令的結果有變動,頁面就會自動從緩存中過期。 SqlCommand對像包含一個NotificationAutoEnlist屬性,該屬性默認值為true。當NotificationAutoEnlist啟用時,頁面和命令間自動創建一個推緩存依賴。注意SqlDataSource的SelectCommand必須符合查詢要求。 b、對DataSource控件使用推SQL緩存依賴: 只需要設置SqlcacheDependency屬性即可。設置SqlCacheDependency=「CommandNotification」 c、對Cache對像使用推SQL緩存依賴: void Page_Load() { DataTable dt=(DataTable)Cache["dtkey"]; if(dt==null) { string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString; SqlDatadapter dad=new SqlDataAdapter("Select a,b From dbo.Mytable",conString); //注意查詢符合要求 SqlCacheDependency sqlDepend=new SqlCacheDependecy(dad.SelectCommand); dt=new DataTable(); dad.Fill(dt); Cache.Insert("dtKey",dt,sqlDepend); } GridView1.DataSource=dt; GridView1.DataBind(); } 注意,SqlCacheDependency類的示例被創建了。一個SqlCommand對像被傳遞給SqlCacheDependency類的構造函數。如果SqlCommand的結果變化了,則這個DataTable會自動從緩存中失效。這些命令的順序很重要。必須在執行該命令之前創建SqlCacheDependency對象。如果在創建SqlCacheDependency對像之前調用Fill()方法,則依賴會被忽略。 至此,有關緩存的總結,已經結束,本章只包含了一些知識要點,具體應用還要是情況對待。