天天看點

asp.net緩存機制

一、緩存的類别

1、頁面輸出ASP.NET資料緩存

頁面輸出緩存是一種傳統級别的相對簡單的緩存機制。它将頁面資料緩存在伺服器記憶體中,當有用戶端再次請求這些内容的時候,伺服器可以直接将這些頁面資料輸出,直到資料緩存過期。

頁面輸出緩存有兩種使用方法:

使用@ OutputCache指令,常見代碼如:

〈%@ OutputCache Duration="60" VaryByParam="sID" Location="Any"%〉

以上例子定義了頁面輸出緩存有效時間為60s,60s後建立緩存;緩存版本因頁面傳遞的sID參數不同而不同;Location="Any"指定了。

使用頁面輸出緩存API該方法在頁面的程式部分執行,常見代碼如:

Response.Cache.SetExpires(DataTime.Now.AddSeconds(60));

上句設定頁面緩存有效時間為60s。

2、頁面部分緩存

有時候我們可能并不希望把整個頁面都緩存起來,而隻是緩存頁面的某個部分。常用方法有3種:

使用@ OutputCache指令

這種方法的實質是:将需要緩存的這部分内容做成使用者自定義控件,然後為自定義控件設定頁面緩存代碼,方法同頁面輸出緩存。

3、應用程式資料緩存

ASP.NET資料緩存的主要功能是在記憶體中存儲各種與應用程式相關的對象。方法有三種: 

指定鍵和值

Cache["keyName"] = "123";

該語句将建立或者重寫名稱為txtName的緩存,并指派為123。

使用Add方法

Cache.Add("keyName","123",null,DataTime.Now.AddSeconds(60),TimeSpan.Zero, CacheItemPriority.High,onRemove);

該句實作上例同樣的功能,并設定其緩存依賴項為null;緩存有效時間為60s;最後一次通路所添加對象時到該對象過期時間的時間間隔為零(TimeSpan.Zero);緩存對象優先級為High;當緩存被删除時調用委托名稱為onRemove。

使用Insert方法

Insert方法和Add方法使用方法基本一緻,但Insert方法還有幾種自己的重載後的方法,例如:

Cache.Insert("keyName","123");

4、緩存依賴

ASP.NET資料緩存的好處很多,但他也有弊端。比如說資料的實時性,使用者擷取的頁面可能是幾十秒甚至是幾個小時以前的伺服器緩存資訊,這一點對于實時性要求比較高的程式來說是不可容忍的。這時候我們可以通過設定緩存依賴,通過對依賴檔案的更改變動情況的判斷,來決定程式是否需要重建(重新整理)緩存。

緩存依賴的方式有很多種,這裡我們着重講解自定義依賴緩存: 自定義緩存依賴

代碼:

string fileName = Server.MapPath

("file.xml");//設定檔案路徑

DateTime dt = DateTime.Now;

//設定跟蹤依賴檔案的開始時間

CacheDependency dep = new CacheDependency

(fileName,dt);//建立依賴對象

二、緩存使用舉例

ASP.NET緩存資料技巧三則

﹤%...@ Page Language="C#" AutoEventWireup="true" CodeFile="date.aspx.cs" Inherits="date" %﹥    

2.  ﹤%...@ OutputCache Duration="60" VaryByParam="CustomerID" %﹥    

3.  ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥    

4.     

5.  ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥    

6.  ﹤head runat="server"﹥    

7.      ﹤title﹥ASP.NET資料緩存﹤/title﹥    

8.  ﹤/head﹥    

9.  ﹤body﹥    

10.     ﹤form id="form1" runat="server"﹥    

11.     ﹤div﹥    

12.           ﹤asp:GridView ID="GridView1" runat="server" BackColor="LightGoldenrodYellow"   

13.             BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None"﹥    

14.             ﹤FooterStyle BackColor="Tan" /﹥    

15.             ﹤SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" /﹥    

16.             ﹤PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" /﹥    

17.             ﹤HeaderStyle BackColor="Tan" Font-Bold="True" /﹥    

18.             ﹤AlternatingRowStyle BackColor="PaleGoldenrod" /﹥    

19.         ﹤/asp:GridView﹥    

20.          ﹤br /﹥    

21.         ﹤br /﹥    

22.         ﹤asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/date.aspx?CustomerID=16"﹥16﹤/asp:HyperLink﹥    

23.         ﹤asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/date.aspx?CustomerID=19"﹥19﹤/asp:HyperLink﹥    

24.         ﹤/div﹥    

25.     ﹤/form﹥    

26. ﹤/body﹥    

27. ﹤/html﹥protected void Page_Load(object sender, EventArgs e)    

28.     ...{    

29.         string conn, comm, id;    

30.         if (Request.QueryString["CustomerID"] == null)    

31.         ...{    

32.             id = "16";    

33.         }    

34.         else   

35.         ...{     

36.             id = Request.QueryString["CustomerID"];    

37.         }    

38.             

39.         conn = "Server=WEB\SQLEXPRESS;Uid=moon;Pwd=1qaz2wsx;Database=store";    

40.         comm = "SELECT * FROM orders WHERE CustomerID =" + id;    

41.    

42.         SqlDataAdapter da = new SqlDataAdapter(comm, conn);    

43.         DataSet ds = new DataSet();    

44.         da.Fill(ds);    

45.    

46.         GridView1.DataSource = ds.Tables[0];    

47.         GridView1.DataBind();    

48.             

49.         Response.Write(DateTime.Now.ToString());    

50.     }   

運作後分别點選16和19會根據這兩個關鍵字SELECT出不同的資料,這時候根據我們傳遞的兩個參數會分别建立兩個緩存頁,在每點選一個關鍵字後請記住顯示的時間,再反複重新整理看看時間有什麼變化!好了接下來講一下資料緩存。

ASP.NET資料緩存(Data Caching)

在System.Web.Caching空間裡有一個類“Cache”我們可以通過這個類對資料進行緩存。

最簡單的緩存方法:Cache["MyCacheString"] = "My CSDN BLOG!!!"; 通過指派的形式建立一個緩存,再通過指派的形式取出緩存:myLabel.Text = Cache["MyCacheString"].ToString();這種方法使用非常的簡單可是功能上受到了一些限制,為了更完善的訂制緩存,應該使用Cache.Insert()方法,下面舉個例子:

頁面裡隻需要放一下GridView就可以了

using System;    

52. using System.Web.Caching;    

53. using System.Data;    

54. using System.Data.SqlClient;    

55. using System.Configuration;    

56. using System.Collections;    

57. using System.Web;    

58. using System.Web.Security;    

59. using System.Web.UI;    

60. using System.Web.UI.WebControls;    

61. using System.Web.UI.WebControls.WebParts;    

62. using System.Web.UI.HtmlControls;    

63.    

64. public partial class DataCache : System.Web.UI.Page    

65. ...{    

66.     DataView dv;//先聲明一個資料視圖用來存放資料庫裡的資料表    

67.    

68.     protected void Page_Load(object sender, EventArgs e)    

69.     ...{    

70.         dv = (DataView)Cache["ds"];//從ASP.NET資料緩存中讀取資料表    

71.    

72.         if (dv == null)//如果緩存是空的,就建立資料庫連接配接,從資料庫裡讀資料    

73.         ...{    

74.             string conn, comm;    

75.             conn = "Server=WEB\SQLEXPRESS;Uid=moon;Pwd=1qaz2wsx;Database=store";    

76.             comm = "SELECT * FROM orders";    

77.    

78.             SqlDataAdapter da = new SqlDataAdapter(comm, conn);    

79.             DataSet ds = new DataSet();    

80.             da.Fill(ds);    

81.             dv = ds.Tables[0].DefaultView;    

82.             //下面這句是關鍵,具體參數後面介紹    

83.             Cache.Insert("ds", dv, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(3));    

84.             Databind();    

85.             Label1.Text = DateTime.Now.ToString();//參考用的時間,可有可無    

86.         }    

87.         else   

88.         ...{    

89.             Databind();    

90.             Response.Write("Is Cache Data!!!");//此句可有可無    

91.         }    

92.     }      

93.         

94.     protected void Databind()//自定義的資料綁定方法    

95.     ...{    

96.         GridView1.DataSource = dv;    

97.         GridView1.DataBind();    

98.     }    

99. }   

ASP.NET資料緩存參數說明

Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan) 1是緩存的名稱,2是緩存的資料對象,3是緩存鍵依賴項,通常為Null,4是過期時間,如果使用相對過期時間則設為NoAbsoluteExpiration,5是可調過期時間,如果參數4使用了固定過期時間,則此參數要設成NoSlidingExpiration。呵呵是不是看的有點暈啊,舉兩個具體例子說一下過期時間的問題

Cache.Insert("ds", dv, null,DateTime.Now.AddMinutes(5) , System.Web.Caching.Cache.NoSlidingExpiration);

在這個例子裡當緩存建立後過5分鐘就過期。

Cache.Insert("ds", dv, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5));

這個例子裡緩存建立後,過期時間為可調,比如1:20秒建立的緩存過期時間應該是6:20但如果在3:20有人通路了緩存,則過期時間将調整為8:20,以此類推……

我們在VS2005裡建立一個測試看看使用緩存前和使用緩存後的性能變化吧!看到沒有,沒有緩存前用了0.43秒而使用緩存後隻用了0.08秒性能相差5倍多啊!!!

三、ASP.NET緩存資料技巧三則

ASP.NET緩存資料技巧:通路緩存的值

由于緩存中所存儲的資訊為易失資訊,即該資訊可能由 ASP.NET 移除,是以建議先确定該項是否在緩存中。如果不在,則應将它重新添加到緩存中,然後檢索該項。

string cachedString;

if (Cache["CacheItem"] != null)

{

cachedString = (string)Cache["CacheItem"];

}

else

//緩存不存在時

Cache.Insert("CacheItem", "Hello, World.")

ASP.NET緩存資料技巧:删除緩存項

由于以下任一原因,緩存中的資料可能會自動移除:緩存已滿、該項已過期、依賴項發生更改。注意:如果調用 Insert 方法,并向緩存中添加與現有項同名的項,則将從緩存中删除該舊項。顯示删除緩存的值:

Cache.Remove("MyCacheKey");

ASP.NET緩存資料技巧:删除緩存項時通知應用程式

從緩存中移除項時通知應用程式,可能非常有用。例如,可能具有一個緩存的報告,建立該報告需花費大量的時間進行處理。當該報告從緩存中移除時,希望重新生成該報告,并立即将其置于緩存中,以便下次請求該報告時,使用者不必等待對此報告進行處理。

ASP.NET 提供了CacheItemRemovedCallback 委托,在從緩存中移除項時能夠發出通知。還提供 CacheItemRemovedReason 枚舉,用于指定移除緩存項的原因。舉例:假設有一個 ReportManager 對象,該對象具有兩種方法,即 GetReport 和 CacheReport。GetReport 報告方法檢查緩存以檢視報告是否已緩存;如果沒有,該方法将重新生成報告并将其緩存。CacheReport 方法具有與 CacheItemRemovedCallback 委托相同的函數簽名;從緩存中移除報告時,ASP.NET 會調用 CacheReport 方法,然後将報告重新添加到緩存中。

建立一個 ASP.NET 網頁,該網頁将調用類中用于将項添加到緩存中的方法。

protected void Page_Load(object sender, EventArgs e)

this.Label1.Text = ReportManager.GetReport();

建立用于在從緩存中删除項時處理通知的完整類ReportManager。

using System;

using System.Web;

using System.Web.Caching;

public static class ReportManager

private static bool _reportRemovedFromCache = false;

static ReportManager() { }

//從緩存中擷取項

public static String GetReport()

lock (typeof(ReportManager))

if (HttpContext.Current.Cache["MyReport"] != null)

{ //存在MyReport緩存項,傳回緩存值

return (string)HttpRuntime.Cache["MyReport"];

{ //MyReport緩存項不存在,則建立MyReport緩存項

CacheReport();

//将項以 MyReport 的名稱添加到緩存中,并将該項設定為在添加到緩存中後一分鐘過期。

//并且該方法注冊 ReportRemoveCallback 方法,以便在從緩存中删除項時進行調用。

public static void CacheReport()

HttpContext.Current.Cache.Add("MyReport", CreateReport(), null, DateTime.MaxValue, new TimeSpan(0, 1, 0), System.Web.Caching.CacheItemPriority.Default, ReportRemovedCallback);

//建立報告,該報告時MyReport緩存項的值

private static string CreateReport()

System.Text.StringBuilder myReport = new System.Text.StringBuilder();

myReport.Append("Sales Report< br />");

myReport.Append("2005 Q2 Figures< br />");

myReport.Append("Sales NE Region - $2 million< br />");

myReport.Append("Sales NW Region - $4.5 million< br />");

myReport.Append("Report Generated: " + DateTime.Now.ToString()

+ "< br />");

myReport.Append("Report Removed From Cache: " +

_reportRemovedFromCache.ToString());

return myReport.ToString();

//當從緩存中删除項時調用該方法。

public static void ReportRemovedCallback(String key, object value, CacheItemRemovedReason removedReason)

_reportRemovedFromCache = true;

不應在 ASP.NET 頁中實作回調處理程式,因為在從緩存中删除項之前該頁可能已被釋放,是以用于處理回調的方法将不可用,應該在非ASP.NET的程式集中實作回調處理程式。為了確定從緩存中删除項時處理回調的方法仍然存在,請使用該方法的靜态類。但是,靜态類的缺點是需要保證所有靜态方法都是線程安全的,是以使用lock關鍵字。

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1081796

繼續閱讀