1. 程式人生 > >.NET的三種快取(頁面快取,控制元件快取,自定義快取)

.NET的三種快取(頁面快取,控制元件快取,自定義快取)

複製程式碼

BLL.Area bll = new BLL.Area();
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["tList"] != null)
{
Response.Write("已經有資料了!!!" + Cache.Count);
this.Repeater1.DataSource = Cache["tList"];
this.Repeater1.DataBind();
}
else
{
Response.Write("沒有資料,請求伺服器獲得資料了!!!");
List<Model.Area> list = bll.GetCityList();
this.Repeater1.DataSource = list;
this.Repeater1.DataBind();
//不設定快取過期時間
//Cache["tList"] = list;
//Cache.Insert("tList",list);
//使用快取的絕對過期時間
Cache.Insert("tList",list,null,DateTime.Now.AddSeconds(35),System.Web.Caching.Cache.NoSlidingExpiration);
//使用快取的相對過期時間
Cache.Insert("tList",list,null,DateTime.MaxValue,new TimeSpan(0,0,15));
Response.Write(Cache.Count);
}

}

複製程式碼

1。頁面快取和控制元件快取的區別:
1.1頁面快取是儲存的被請求頁面物件執行後生成的html程式碼。
控制元件快取是儲存的資料來源控制元件上次查詢到的 資料集合(List<Classes> list)

1.2頁面快取一旦使用,那麼在快取失效之前,伺服器都不會在建立被請求的頁面類物件來執行生成html程式碼了,而是直接從快取裡獲上次生成的HTML程式碼
控制元件快取一旦使用,那麼不管快取有沒有失效,伺服器都會為每個瀏覽器請求建立頁面類物件並執行生成Html程式碼。只不過,在執行頁面物件的過程中,當發現數據源控制元件已經快取了上次查詢的結果資料,就不再呼叫資料來源繫結的方法來獲得資料,而是直接從快取中獲上次查詢的資料。

2.1絕對過期時間:是指定一個確切的時間點,過了,快取就自動清空。
2.2相對過期時間:是指定一個確切的時間戳(如:15秒),那麼頁面在15秒內被任何一個瀏覽器訪問,快取失效時間都會更新回15秒並重新倒數計時。一旦15秒內沒有任何訪問,那麼伺服器就會清空該快取。

// 引數:
// key:
// 用於引用該物件的快取鍵。
//
// value:
// 要插入快取中的物件。
//
// dependencies:
// 該項的檔案依賴項或快取鍵依賴項。當任何依賴項更改時,該物件即無效,並從快取中移除。如果沒有依賴項,則此引數包含 null。
//
// absoluteExpiration:
// 所插入物件將到期並被從快取中移除的時間。要避免可能的本地時間問題(例如從標準時間改為夏時制),請使用 System.DateTime.UtcNow
// 而不是 System.DateTime.Now 作為此引數值。如果使用絕對到期,則 slidingExpiration 引數必須為 System.Web.Caching.Cache.NoSlidingExpiration。
//
// slidingExpiration:
// 最後一次訪問所插入物件時與該物件到期時之間的時間間隔。如果該值等效於 20 分鐘,則物件在最後一次被訪問 20 分鐘之後將到期並被從快取中移除。如果使用可調到期,則
// absoluteExpiration 引數必須為 System.Web.Caching.Cache.NoAbsoluteExpiration。
//
// priority:
// 該物件相對於快取中儲存的其他項的成本,由 System.Web.Caching.CacheItemPriority 列舉表示。該值由快取在退出物件時使用;具有較低成本的物件在具有較高成本的物件之前被從快取移除。
//
// onRemoveCallback:
// 在從快取中移除物件時將呼叫的委託(如果提供)。當從快取中刪除應用程式的物件時,可使用它來通知應用程式。
//
// 異常:
// System.ArgumentNullException:
// key 或 value 引數為 null。
//
// System.ArgumentOutOfRangeException:
// 將 slidingExpiration 引數設定為小於 TimeSpan.Zero 或大於一年的等效值。
//
// System.ArgumentException:
// 為要新增到 Cache 中的項設定 absoluteExpiration 和 slidingExpiration 引數。
public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

使用例子如下:

BLL.Area bll = new BLL.Area();
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["tList"] != null)
{
Response.Write("已經有資料了!!!" + Cache.Count);
this.Repeater1.DataSource = Cache["tList"];
this.Repeater1.DataBind();
}
else
{
Response.Write("沒有資料,請求伺服器獲得資料了!!!");
List<Model.Area> list = bll.GetCityList();
this.Repeater1.DataSource = list;
this.Repeater1.DataBind();
//不設定快取過期時間
//Cache["tList"] = list;
//Cache.Insert("tList",list);
//使用快取的絕對過期時間
//Cache.Insert("tList",list,null,DateTime.Now.AddSeconds(35),System.Web.Caching.Cache.NoSlidingExpiration);
//使用快取的相對過期時間
//Cache.Insert("tList",list,null,DateTime.MaxValue,new TimeSpan(0,0,15));
CacheDependency cdd=new CacheDependency (Server.MapPath("CacheDependency.txt"));
Cache.Insert("tList", list, cdd, DateTime.MaxValue, new TimeSpan(0, 0, 35), CacheItemPriority.Normal, aa);
Response.Write(Cache.Count);
}

}

private void aa(string key, object value, CacheItemRemovedReason reason)
{
string msg = "Key: " + key + ",Value: " + value.ToString() + "Reson: " + reason.ToString();
string logPath = Server.MapPath("SelfCache_Log.txt");
System.IO.File.WriteAllText(logPath, msg);
}