ASP.NET中緩存的詳解

頁面輸出緩存屬性設置:

@OutputCache指令設置頁面輸出緩存。@OutputCache指令在asp.net頁或者頁中包含的用戶控件的頭部聲明。

@OutputCache的常用屬性如下:

1、    CacheProfile 此屬性是爲了調用webconfig文件中<outputCacheSetting>節下<outputCacheProfiles> 節點下一個可用項。

如:webconfig中增加節點<caching>

<caching>

        <outputCacheSettings>

          <outputCacheProfiles>

            <add name="webCache" duration="10" varyByControl="none" varyByParam="none"/>

          </outputCacheProfiles>

        </outputCacheSettings>

</caching>

那麼在頁頭的設置爲

<%@ OutputCache CacheProfile="webCache"%>即可。

需要注意的是包含用戶控件中的@OutputCache指令不支持此屬性

2、    NoStore

此屬性定義一個布爾值,用於決定是否阻止敏感信息的二級存儲。需要注意的是包含用戶控件中的@OutputCache指令不支持此屬性。將此屬性設爲true,等效於在請求期間執行代碼”Response.Cache.SetNoStore()”

3、    Duration

用於設置緩存的時間,單位是秒。

需要注意的是:該屬性是必須的,否則將會引起分析器錯誤。

4、    Shared

該屬性爲布爾值,用於確定用戶控件的輸出是否可以有多個頁共享。默認值爲false

需要注意的是:包含在ASP.NET頁中的@outputCache指令不支持此屬性。

5 Location

   用於指定輸出緩存項的位置。其屬性值是OutputCacheLocation枚舉值,他們是Any Client DownStream None Server ServerAndClient.默認值爲:Any

   需要注意的是:包含用戶控件中的@OutputCache指令不支持此屬性。

6、  SqlDependency

  該屬性標識一組數據庫/表名稱對的字符串值,頁或控件的輸出緩存依賴於這些名稱對。

7、  VaryByControl

該屬性使用一個分號分隔的字符串列表來更改用戶控件的輸出緩存。該字符串爲服務器控件的ID屬性值。除非已經包含了VaryByParam屬性,否則在@OutputCache中此屬性是必須的。

8、  VaryByCustom

用於自定義輸出緩存要求的任意文本。如果屬性值設爲Brower,緩存將隨瀏覽器名稱和主要版本信息的不同而異。如果輸入了自定義字符串,必須在Global.asax文件中重寫HttpApplication.GetVaryByCustomString方法。

主要是爲控件設置緩存。

9、  VaryByHeader

10、              VaryByParam

此屬性基於使用POST或者GET方式發送的名稱/值對來改變緩存。該屬性是必須的

  示例如下:

  在一個web窗體中加入ID=”lab”的標籤,以記錄當前時間。一個ID=”btn”的控件,用於發送url

1、  webconfig中加入

<caching>

        <outputCacheSettings>

          <outputCacheProfiles>

            <add name="webCache" duration="10" varyByControl="none" varyByParam="name" />

          </outputCacheProfiles>

        </outputCacheSettings>

</caching>

2、頁頭引入<%@ OutputCache CacheProfile="webCache"%>

 3、加入兩個函數:

 public void Page_Load(object sender, EventArgs e)

        {

            string str = DateTime.Now.ToString();

            lab.Text =str;

        }

public void btn_Click(object sender,EventArgs e)

        {

            Random rnd = new Random();

            int n = rnd.Next(100);

            string str = n.ToString();

            string url = "OutputCache.aspx?name=" + str;

            Response.Redirect(url);

           

        }

這樣,在不單擊按鈕的情況之下,刷新頁面的情況之下,lab控件的值每個十秒改變一次。但是,在單擊btn之下,lab控件的就跟着發生改變。

原因:btn改變了name的值,導致緩存失效。

 

頁面輸出緩存API

該方法的核心是調用System.Web.HttpCachePolicy.該類主要包含用於設置緩存特定的HTTP標頭的方法和用於控制ASP.NET頁面輸出緩存的方法。

Response.Cache返回類HttpCachePolicy的實例。

 

 

 

 

 

 

頁面部分緩存

實現頁面部分緩存有兩種機制:

1、將緩存部分放在用戶控件之中。―――控件緩存

控件緩存的實質是對用戶控件的緩存設置。有三種方法:一是用@OutputCache指令聲明設置。二是在代碼隱藏文件中使用PrticalCachingAttribute類設置用戶控件緩存。三是用ControlCachePolicy類以編程方式指定用戶控件緩存設置。

2、緩存後替換機制。該方法是現設置整個頁面緩存,再將頁面中一部分設置爲不緩存。

A、利用@OutputCache指令以聲明的方式設置用戶控件緩存。有六個屬性:

Duration  Shared  SqlDependency  VaryByControl VaryByCustom  VaryByParam

注意:

當用戶控件和放置用戶控件的頁面都設置了緩存之時:

以設置緩存過期時間長的爲準.如:頁面的緩存過期時間爲100s,控件的緩存過期時間爲50s,則控件的緩存過期時間調整爲100s。總之,以長時間爲準。

B在代碼隱藏文件中使用PrticalCachingAttribute類設置用戶控件緩存

   ParticalCachingAttribute類有4個構造函數和6個屬性。

   [ParticalCaching(int duration)]

   [ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom)]

[ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom,bool shared)]

[ParticalCaching(int duration,string varyByParams,

string varyByContorl,string varyByCustom,string sqlDenpendency,bool shared )]

使用PrticalCachingAttribute類需要注意一下幾點

一是構造函數必需放在用戶控件的聲明頭部,如

[PartialCaching(10)]

public partial class lab : System.Web.UI.UserControl

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString();

 

    }

}

這是用第一個構造函數來初始化PrticalCachingAttribute類對象,ASP.NET分析器將生成ParticalCachingControl類的實例來包裝該控件。

二是用戶控件的加載是動態的,也就是說不能在聲明之後直接使用。

生成ParticalCachingControl類的實例還有一個必要條件,必需通過TemplateControl.LoadControl方法動態加載用戶控件,並且將用戶控件插入頁面的控件層次中。如:

 

 

public void Page_Init(object sender, EventArgs e)

        {

           Control pca = TemplateControl.LoadControl("lab.ascx");

           Controls.Add(pca); }

或者直接在用戶控件的文件中引用@OutputCache指令來實現ParticalCacheAttribute類的實例來包裝用戶控件。然後動態加載用戶控件

public void Page_Init(object sender, EventArgs e)

        {

           Control pca = TemplateControl.LoadControl("lab.ascx");

           Controls.Add(pca); }

總之,直接在用戶控件的文件中引用@OutputCache指令或在用戶控件的聲明的頭部使用ParticalCacheAttribute的構造函數,效果是等效的。

C三是用ControlCachePolicy類以編程方式指定用戶控件緩存設置。

ControlCachePolicy類與上面的HttpCachePolicy類似,但是HttpCachePolicy用於頁面輸出緩存,而ControlCachePolicy用於用戶控件緩存。

創建ControlCachePolicy類實例方法:

必須訪問ParticalCacheControl類的BasePartialCachingControl.CachePolicy屬性(BasePartialCachingControlParticalCacheControl)的基類。

而且還必須用LoadControl方法動態加載用戶控件,這樣才能獲得ParticalCacheControl類包裝的用戶控件。若要確定用戶控件是否支持緩存,可檢查SupportsCaching屬性。

ControlCachePolicy實例僅在控件生命週期的InitPreRender階段之間,才能成功操作。因爲在呈現控件之後所進行的任何更改都無法影響緩存設置。

ControlCachePolicy的常用屬性有;

Cached Dependency Duration SupportCaching VaryByControl VaryByParam 

3個常用方法:

 Public void SetExpires(DateTime expirationTime)

 Public void SetSlidingExpiration( bool useSlidingExpiration )

 Public voix SetVaryByCustom(string varyByCustom )

示例:

一是在用戶控件的聲明頭部調用PartialCacheAttribute類的構造函數.實現PartialCacheAttribute類對用戶控件的包裝。

[PartialCaching(10)]

public partial class lab : System.Web.UI.UserControl

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString();

 

    }

}

 

 

 

 

二是

public void Page_Init(object sender, EventArgs e)

        {

            PartialCachingControl pcc = LoadControl("lab.ascx") as PartialCachingControl;

            ControlCachePolicy ccp = pcc.CachePolicy;

            if (ccp.Duration >= TimeSpan.FromSeconds(10))

            {

                ccp.SetExpires(DateTime.Now.Add(TimeSpan.FromSeconds(15)));

                ccp.SetSlidingExpiration(false);

            }

            Controls.Add(pcc);      

        }

 

緩存後替換

實現機制是:將整個頁面設置爲頁面輸出緩存,對那些不緩存的部分使用緩存後替換功能。

實現方法:

1、  以聲明方式使用Substitution控件

2、  以編程方式使用Substitution控件API

3、以隱式方式使用AdRotator控件

實例:

1、以聲明方式使用Substitution控件

Substitution控件爲替換控件。當頁面(設置爲頁面輸出功能)第一次執行時,Substitution控件也執行,返回其顯示的內容。當後續請求時,頁面從緩存中讀取。而Substitution控件每次都調用自己的回調函數,實現內容的及時更新。

<asp:Substitution ID="" runat="server" MethodName="GetCurrentTime" />

此控件的聲明中有個MethodName屬性,以調用回調函數

此函數必須爲:

1、必須爲static類型

2、返回值必須爲string類型

3、參數必須爲HttpContext類型

如:

public static string GetCurrentTime(HttpContext hc)

        {

            return DateTime.Now.ToString();

        }

2以編程方式使用Substitution控件API

 此方法主要是使用Response類的

Public void  WriteSubstitution(HttpResponseSubstitutionCallBack callback) 方法

HttpResponseSubstitutionCallBack是一個委託類型,爲

Public delegate string HttpResponseSubstitutionCallbackHttpContext context

使用WriteSubstitution的方法的優點是可以調用任意對象的方法,而不是隻能調用Page或者UserControl對象的靜態方法。

如在aspx頁面中調用

<%Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentTime));%>方法。

3、以隱式方式使用AdRotator控件 請參照AdRotator控件的詳細用法

 

 

 

 

應用程序數據緩存

主要功能:應用程序數據緩存主要功能是在內存中存儲那些與應用程序相關的對象,通常這些對象都需要耗費大量的服務器資源才能得到。

主要實現方法:應用程序數據緩存主要有Cache類實現,該類位於System.Web.Caching命名空間之中。

通常有三種方法:

1、  使用鍵值對直接將對象加入的緩存Cache對象之中。

Cache[“MyCache”]=TxtUserName.Text;

此方法的弊端是無法設置緩存有效期、依賴對象等。

2、  使用Cache對象的Add方法。

Public object  Add(String key,object  value,  CacheDependency  dependency, DateTime absoluteExpiration,TimeSpan slidingExpiration, CacheItemPriority priority,CacheItemRemovedCallback callback)

  要想使用此方法,必須徹底弄明白這幾個參數的意思。

 其中最後一項是個委託類項,其原型爲:

  public delegate void CacheItemRemovedCallback (

            string key,

            Object value,

            CacheItemRemovedReason reason

)

當緩存對象被移除時,將調用此對應的處理函數。

注意:採用Add方法時,注意不要加入相同鍵的緩存對象,否則出現異常

3、  使用Insert方法。

Insert方法比較靈活,有4個重載函數。

名稱

說明

Cache.Insert (String, Object)

Cache 對象插入項,該項帶有一個緩存鍵引用其位置,並使用 CacheItemPriority 枚舉提供的默認值。

Cache.Insert (String, Object, CacheDependency)

Cache 中插入具有文件依賴項或鍵依賴項的對象。

Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan)

Cache 中插入具有依賴項和過期策略的對象。

Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority, CacheItemRemovedCallback)

Cache 對象中插入對象,後者具有依賴項、過期和優先級策略以及一個委託(可用於在從 Cache 移除插入項時通知應用程序)。

注意:

Insert方法加入具有相同鍵名的對象時,出現覆蓋現象。不出現異常。這是Insert方法與Add方法的主要區別。

 

 

 

緩存依賴

功能機制:將緩存對象與緩存依賴對象(如文件、目錄、數據表)建立關聯,當這些緩存依賴對象更改時,移除緩存對象。下次請求時,重設緩存對象。這樣,始終保持緩存對象存儲的數據是最新的。

緩存依賴類關係圖:

CacheDependency

AggregateCacheDependency

SqlCacheDependency

實現方法:通過CacheDependency類的9大構造函數,來構造緩存依賴,來監視跟蹤對所指定的文件、目錄、或其他緩存依賴的更改。在通過Cache類的InsertAdd方法,設置緩存依賴與緩存對象之間的關係。

CacheDependency類有兩個重要的屬性。一是HasChanged屬性,表示依賴對象是否更改。

二是UtcLastModified屬性,用於獲取依賴對象上次被更改的時間。

示例代碼爲(實現自定義依賴類對象):

string fileName = Server.MapPath("file.xml");

CacheDependency cd = new CacheDependency(fileName, DateTime.Now);

Cache.Insert("CityFile",cityFile,cd);

實現聚合緩存依賴

聚合緩存依賴可以實現一個緩存對象與多個依賴對象建立關聯。當每個依賴項發生更改時,就移除緩存對象。

如:

CacheDependency dep1 = new CacheDependency(fileName1);

SqlCacheDependency dep2 = new SqlCacheDependency(cmd);

CacheDependency[]  deps=new CacheDependency{dep1,dep2};

AggregateCacheDependency aggDep=new AggregateCacheDependency();

Cache.Insert("key",date,deps);

 

 

Sql數據緩存依賴

功能核心:利用SqlCacheDependency類,在應用程序數據緩存對象與SQLserver數據庫表,或者SQL2005查詢結果之間,建立緩存依賴關係。當數據更改時,自動移除緩存對象。當下次請求時,如果該緩存對象不在,則再次向緩存中添加更新後的版本。

由於sql版本不同,所以sql對緩存依賴的支持也不同。

 

SQLserver7.0 /2000

 Sql2005

實現機制

 使用基於輪詢的實現機制

使用通知傳遞服務

是否需要配置啓用

需要配置,以便啓用

不需要,內置支持,自動啓用

數據更改檢測

只限於數據表級的檢測

可應用於數據表級、數據行級的更改檢測

是否支持SqlCacheDependency

支持

支持

SqlCacheDependency有兩給構造函數

Public  SqlCacheDependency(sqlcommand sql_cmd)

Public  SqlCacheDependency(string datebaseEntryName,string tableName)

對於sql2005只能應用函數一:

注意(sqlcommand參數):

1、           必須完全限定表名。如:dbo.Customers

2、           Select中的參數不能使用*,必須一一列出。

select name,address,city, states from dbo.customers

如果頁面設置的頁面輸出緩存設置的與sql2005的數據緩存依賴有關,則,不能使用此構造函數。

3   不能在查詢語句中使用聚合函數。

對於sql7.0/2000只能應用函數二:第一個參數必須與webconfig<SqlCacheDependency><databases>子配置節定義的數據庫名稱,這就意味着必須在webconfig中定義給該參數的數據庫名稱。如   name="PubsDB"

connectionStringName="PubsString"是調用connectionStrings字節中的連接字符串名字。

<connectionStrings>

    <add name="PubsString" connectionString="server=localhost;database=pubs;user id=sa;password=guest;"></add>

  </connectionStrings>

///////////////////////////////////////////////////////

<caching>

<sqlCacheDependency>

<datebases>

<add name="PubsDB" connectionStringName="PubsString"></add>

</datebases>

</sqlCacheDependency>

</caching>

第二個參數用於設置關聯的表名。

針對sql2000建立sql數據緩存依賴詳細過程:

1、                利用aspnet_regsql.exe(默認情況之下:位於C:WINDOWS/Microsoft.NET/FrameWork/[版本號])工具從後臺建立sql數據緩存依賴過程。其本質是在後臺使用SqlCacheDependencyAdmin類。

     第一步:打開dos命令窗口,輸入

     aspnet_regsql S localhoat U sa P mypassword d pubs ed

   Localhost爲服務器名,sa爲帳號,mypassword爲密碼,pubs爲數據庫名

   這樣,將會提示數據庫創建緩存依賴成功。

第二步:輸入

aspnet_regsql S localhoat U sa P mypassword d pubs t titles -et

titles爲表名。這樣將會提示爲數據庫表創建緩存依賴成功。

以上兩步創建成功之後,打開SQL2000,查看數據庫中的數據表將會發現:新建了一個名爲:ASPNet_SqlCacheTablesForChangeNotification的數據表。

此表具有三個字段:

TableName  用來設置緩存依賴的表。

NotificationCreated 用於存儲數據表被更新的時間。

ChangedID  用來存儲數據表被更改的次數。此時,如果數據表中的數據發生變化,changedID也將發生變化。

2、在前臺使用SqlCacheDependencyAdmin類來創建sql數據緩存依賴。

DisableNotifications

禁用指定數據庫的 SqlCacheDependency 更改通知。

DisableTableForNotifications

已重載。 禁用 SQL Server 數據庫表或數據庫表的數組的 SqlCacheDependency 更改通知。

EnableNotifications

啓用指定數據庫的 SqlCacheDependency 更改通知。

EnableTableForNotifications

已重載。 連接到 SQL Server 數據庫併爲 SqlCacheDependency 更改通知準備一個或多個數據庫表。

Equals 

已重載。 確定兩個 Object 實例是否相等。 (從 Object 繼承。)

GetHashCode 

用作特定類型的哈希函數。GetHashCode 適合在哈希算法和數據結構(如哈希表)中使用。 (從 Object 繼承。)

GetTablesEnabledForNotifications

檢索一個字符串數組,該數組包含 SQL Server 數據庫中爲其啓用了更改通知的每個表的名稱。

在前臺操縱SqlCacheDependencyAdmin類,通常是在Global.aspx文件中,實現對sql數據緩存依賴功能的統一管理。如:

void Application_Start(object sender, EventArgs e)

    {

        // 在應用程序啓動時運行的代碼

 

}

在此函數中進行操作。

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