天天看點

ASP.NET--CACHE緩存

 ASP.NET中提供了兩種緩存更新政策:

   1.被動更新。緩存過期以後手動進行更新

   2.主動更新。緩存過期以後在回調方法中更新

如果我們現在要緩存一個資料集:DataSet ds=getData();//getdata()是一個自定義方法,從資料庫擷取資料

   A.插入永不過期的緩存:Cache.Insert("data",ds);

   B.插入絕對時間過期緩存:Cache.Insert("data",ds,null,DateTime.now.AddSeconds(10),TimeSpan.Zero);

   C.插入變化時間過期緩存:Cache.Insert("data",ds,null,DateTime.Maxvalue,TimeSpan.FromSeconds(10));

總結這三種緩存過期政策:

   A:永不過期:直接複制緩存的key 和value即可

   B:絕對時間過期:DateTime.Now.AddSeconds(10)表示緩存在10秒後過期,TimeSpan.Zero表示不使用平滑過期政策。

   C:變化時間過期(平滑過期):DateTime.MaxValue表示不使用絕對時間過期政策,TimeSpan.FromSeconds(10)表示緩存連續10秒沒有通路就過期。

Add()方法也可在cache中添加緩存,但它隻能添加緩存中沒有的項,如果存在将添加失敗(但不會抛出異常),Insert()方法将覆寫原來的項。

另外還有一個依賴過期政策,即緩存中的依賴項(比如一個檔案)的内容改變之後緩存也就失效了。例如 建立一個緩存依賴項:

CacheDependency cd = new CacheDependency(Server.MapPath("test.txt"));

    DataSet ds = GetData();

    Cache.Insert("Data", ds, cd); 這就添加了一個一個依賴于 test.txt檔案的緩存過期政策。

cache緩存的更新政策

     在Web程式中我們通常會使用被動更新。所謂被動更新,就是在調用資料的時候判斷緩存是否為空,如果為空則先更新緩存然後再從緩存中讀取資料,如果不為空則直接從緩存中讀取資料。

     可以利用緩存的回調功能讓緩存過期後自動續建實作自動更新的目的。

    DataSet ds = GetData();

    Cache.Insert("Data", ds, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero,

    CacheItemPriority.Default, CacheRemovedCallback);

最後一個參數表明緩存被移除以後自動調用CacheRemovedCallback()方法。

手動移除某個緩存的方法: 

    Cache.Remove("Data");

    如果要移除所有緩存隻能通過周遊來實作:

IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();

while (CacheEnum.MoveNext())

{

    Cache.Remove(CacheEnum.Key.ToString());

}

cache總結

·      存儲的實體位置。伺服器記憶體。

·      存儲的類型限制。任意類型。

·      狀态使用的範圍。目前請求上下文,所有使用者共用一份。

·      存儲的大小限制。任意大小。

·      生命周期。有多種過期政策控制緩存的銷毀。

·      安全與性能。資料總是存儲在服務端,安全性比較高,但不易存儲過多資料。

·      優缺點與注意事項。檢索資料速度快,過期政策豐富。注意别把對實時性要求很高的資料放到Cache中,不斷更新Cache會對資料庫造成壓力。

主要有兩種類型的緩存:

1.輸出緩存Output caching

2.資料緩存Data caching

上面主要說的是資料緩存,下面說下輸出緩存

1. 輸出緩存(Output Caching)

使用輸出緩存,你可以緩存最後輸出的HTML頁面,當相同的頁面再次請求的時候,ASP.NET不會再執行頁面的生命周期和相關代碼而是直接使用緩存的頁面,文法如下:<%@ OutputCache Duration=”60” VaryByParam=”None”  %>  

如果你的頁面是通過查詢字元串來擷取資訊的,你可以根據查詢字元串很容易的緩存頁面的不同拷貝。VarByParam=”None”指定ASP.NET隻存儲緩存頁面的一個拷貝。VarByParam=”*” 指定ASP.NET根據不同的查詢字元串存儲不同的緩存頁面。

<%@ OutputCache Duration="60" VaryByParam="*" %> <div align="right"> <a href="OutputCachingTest2.aspx" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" mce_href="OutputCachingTest2.aspx" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >No Query String</a> | <a href="OutputCachingTest2.aspx?id=1" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" mce_href="OutputCachingTest2.aspx?id=1" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >ID 1</a> | <a href="OutputCachingTest2.aspx?id=2" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" mce_href="OutputCachingTest2.aspx?id=2" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >ID 2</a> | <a href="OutputCachingTest2.aspx?id=3" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" mce_href="OutputCachingTest2.aspx?id=3" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >ID 3</a> | <a href="OutputCachingTest2.aspx?id=3&langid=1" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" mce_href="OutputCachingTest2.aspx?id=3&langid=1" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >ID 3</a> </div>