ASP.Net快取總結

iDotNetSpace發表於2009-12-18

提高效能最好最快的辦法當然是通過快取來改善,對於任何一個web開發者都應該善用快取。Asp.net下的快取機制十分強大,用好快取機制可以讓我們極大的改善web應用的效能,下面是一些總結的快取的知識點,與大家分享交流:
1.頁面快取 
       要實現頁面輸出快取,只要將一條 OutputCache 指令新增到頁面即可。  
          
             CacheProfile
             用於定義與該頁關聯的快取設定的名稱。是可選屬性,預設值為空字元("")。需要注意的是,包含在使用者控制元件中的@ OutputCache指令不支援此屬性。在頁面中指定此屬性時,屬性值必須與Web.config檔案配置節下的outputCacheProfiles元素中的一個可用項的名稱匹配。如果此名稱與配置檔案項不匹配,將引發異常。
             NoStore
             該屬性定義一個布林值,用於決定是否阻止敏感資訊的二級儲存。需要注意的是,包含在使用者控制元件中的@ OutputCache指令不支援此屬性。將此屬性設定為true等效於在請求期間執行程式碼“Response.Cache.SetNoStore();”。
            Duration
             用於設定頁面或者使用者控制元件快取的時間。單位是秒。通過設定該屬性,能夠為來自物件的HTTP響應建立了一個過期策略,並將自動快取頁或使用者控制元件輸出。需要注意的是,Duration屬性是必需的,否則將會引起分析器錯誤。
             Shared
             該屬性定義一個布林值,用於確定使用者控制元件輸出是否可以由多個頁共享。預設值為false。注意,包含在ASP.NET頁中的@ OutputCache指令不支援此屬性。
            Location
             用於指定輸出快取項的位置。其屬性值是OutputCacheLocation列舉值,它們是Any、Client、Downstream、None、Server和ServerAndClient。預設值是Any,表示輸出快取可用於所有請求,包括客戶端瀏覽器、代理伺服器或處理請求的伺服器上。需要注意的是,包含在使用者控制元件中的@ OutputCache指令不支援此屬性。
             SqlDependency
             該屬性標識一組資料庫/表名稱對的字串值,頁或控制元件的輸出快取依賴於這些名稱對。需要注意:SqlCacheDependency類監視輸出快取所依賴的資料庫中的表,因此,當更新表中的項時,使用基於表的輪詢將從快取中移除這些項。當通知(在SQL Server 2005中)與CommandNotification值一起使用時,最終將使用SqlDependency類向SQL Server 2005伺服器註冊查詢通知。另外,SqlDependency屬性的CommandNotification值僅在ASP.NET頁中有效。控制元件只能將基於表的輪詢用於@ OutputCache指令。
             VaryByControl
             該屬性使用一個分號分隔的字串列表來更改使用者控制元件的輸出快取。這些字串代表在使用者控制元件中宣告的ASP.NET伺服器控制元件的ID屬性值。除非已經包含了VaryByParam屬性,否則在@ OutputCache指令中,該屬性是必需的。
             VaryByCustom
             用於自定義輸出快取要求的任意文字。如果賦予該屬性值是browser,快取將隨瀏覽器名稱和主要版本資訊的不同而異。如果輸入了自定義字串,則必須在應用程式的Global.asax檔案中重寫HttpApplication.GetVaryByCustomString方法。
            VaryByHeader
             該屬性中包含由分號分隔的HTTP標頭列表,用於使輸出快取發生變化。當將該屬性設為多標頭時,對於每個指定的標頭,輸出快取都包含一個請求文件的不同版本。VaryByHeader屬性在所有HTTP 1.1快取中啟用快取項,而不僅限於ASP.NET快取。使用者控制元件中的@ OutputCache指令不支援此屬性。
             VaryByParam
             該屬性定義了一個分號分隔的字串列表,用於使輸出快取發生變化。預設情況下,這些字串與用GET方法屬性傳送的查詢字串值對應,或與用POST方法傳送的引數對應。當將該屬性設定為多引數時,對於每個指定的引數,輸出快取都包含一個請求文件的不同版本。可能的值包括“none”、“*”和任何有效的查詢字串或POST引數名稱。值得注意的是,在輸出快取ASP.NET頁時,該屬性是必需的。它對於使用者控制元件也是必需的,除非已經在使用者控制元件的@ OutputCache指令中包含了VaryByControl屬性。如果沒有包含,則會發生分析器錯誤。如果不需要使快取內容隨任何指定引數發生變化,則可將該值設為“none”。如果要使輸出快取根據所有引數值發生變化,則將屬性設定為“*”。
     
       建立頁面輸出快取檔案依賴
       示例程式碼:Response.AddFileDependency(MapPath("test.xml"));
       如需要建立依賴多檔案關係,則使用AddFileDependencies()方法。
      
       使用程式設計方式設定頁面快取過期
      
       示例程式碼:HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/test.aspx"));
       此方法只接受一個"虛擬絕對"路徑,因此需用Page.ResolveUrl()方法轉換
      
       使用程式設計方式設定多個頁面快取過期(建立鍵依賴(key dependency))
      
       示例程式碼:
       快取頁面:PageLoad:
        Cache.Insert(“key”,DateTime.Now);
        Response.AddCacheItemDependency("key");
       通過此法向多個頁面新增依賴項
       移除依賴項:PageLoad:
       Cache.Remove("key");
       以程式設計方式操作頁面輸出快取
       操作由Response.Cache屬性暴露的HttpCachePolicy類物件的方法。
       建立頁面輸出快取配置
   
         
               
                   
                           
                   

               

         

      

http://www.gzu521.com/
2.部分頁面快取
       快取後替換
      
       採用宣告方式,使用Substitution控制元件,設定MethodName屬性所需的方法,此方法必須是靜態方法,因為當前頁輸出快取時,頁面例項還沒被建立。注:AdRotator內部使用了快取後替代。
      
       以程式設計方式設定快取後替換,使用Response.WriteSubstitution()方法,好處:1,此方法引用的方法不一定是當前類的方法,可以是另一個類的實力或靜態方法。2,可以在自定義控制元件中使用此方法實現快取後替換。
      
       部分頁面快取:使用者控制元件快取
      
       給使用者控制元件新增指令。此指令包含一個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快取依賴。
             <!-- caching section group --&gt
               
                   //通過pollTime 的設定,定時拉資料庫的修改
                   
                                               connectionStringName="NorthwindConnectionString1"
                       pollTime = "1000"
                      />
                   

               

               

      a、 對頁面輸出快取使用拉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 “yourserverAspnet”
       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()方法,則依賴會被忽略。
       至此,有關快取的總結,已經結束,本章只包含了一些知識要點,具體應用還要是情況對待。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-622794/,如需轉載,請註明出處,否則將追究法律責任。

相關文章