深入System.Web.Caching名稱空間 教你Hold住快取管理(一)
本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會:
- 第一篇-如何實現簡單的資料快取
- 第二篇-快取從檔案中讀取的資料,並通過檔案依賴實現快取資料的及時更新
- 第三篇-快取資料庫中的整張表,並通過資料庫依賴實現快取資料的及時更新
一,System .Web.Caching與快取工作機制簡介
System.Web.Caching是用來管理快取的名稱空間,其父級空間是System.Web,由此可見,快取通常用於Web網站的開發,包括在B/S專案中的開發。
快取的設計主要是考慮到網路頻寬可能會延緩資料的提交與回發,如果把資料儲存在客戶端,使用者就可以直接從客戶端讀取資料,減少客戶端與伺服器端的資料互動,提高程式的效能。
快取名稱空間中的類及其說明:
- Cache 對快取物件的編輯類,其操作包括快取的增刪改
- CacheDependency 基本快取物件的依賴,當基本物件發生變化時,更新快取內容
- SqlCacheDependency 資料庫快取物件的依賴,當資料庫中的資料發生變化時,更新緩內容
其中,快取任何物件都使用類Cache,但當快取發生改變時,普通物件與資料庫物件的依賴處理不同,分別對應以上兩個依賴。
下圖展示了三層結構中快取的工作機制:
二,管理快取的類:Cache
1.功能說明
Cache類屬於字典類(鍵-值對),其根據一定的規則儲存使用者需要的資料,這些資料的型別不受限制,快取的資料可以是字串,陣列,資料表,自定義類等等。
使用Cache類的優點是當快取的資料發生變化時,Cache類會讓當前快取資料失效,並實現快取資料的重新新增,然後通知應用程式,報告快取的及時更新。
2.語法定義
Cache類的語法定義如下:
public sealed class Cache : IEnumerable
通過定義發現,Cache類是sealed密封的類,不能被整合。同時Cache繼承了IEnumerable介面,允許對集合中的資料進行列舉操作。
快取的生命週期隨著應用程式域的活動結束而終止,也就是說只要應用程式域依然出於活動狀態,快取就一直會保持,因為每個應用程式域都會建立一個快取例項。此例項的資訊可以通過HttpContext物件,Page物件的Cache屬性獲取。
3.方法詳解
Cache類的方法主要提供對快取資料的編輯操作:
- Add 將資料新增到Cache物件
- Insert 向Cache中插入資料項,可用於修改已經存在的快取資料項
- Remove 移除Cache物件中的快取資料項
- Get 從Cache物件中獲取指定的資料項,注意返回的是Object型別,需要進行型別轉換。
- GetType 從Cache物件中獲取資料項的型別,判斷資料型別後方便進行型別轉換。
- GetEnumerator 迴圈訪問Cache物件中的快取資料項,其返回型別是"IDictionaryEnumerator"
最需要注意的是Add方法的引數,其使用語法如下:
public object Add(
string key, object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration,
CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback
);
- key:表示快取資料項的鍵值Key,必須是唯一的。
- value:要新增到快取的項。可以是任意的型別。
- dependencies:表示快取的依賴項,此項發生變化時就意味著快取內容已經過期,並從快取中移除。如果沒有依賴項,則此值設定為null。
- absoluteExpiration:絕對到期,所新增物件將到期並被從快取中移除的時間。
- slidingExpiration:可調到期,最後一次訪問所新增物件時與該物件到期時之間的時間間隔。如果該值等效於20分鐘,則物件在最後一次被訪問20分鐘之後將到期並從快取中移除。
- priority:撤銷快取的優先值,由System.Web.Caching.CacheItemPriority列舉表示。快取在退出物件時使用該值,優先順序低的資料項先被刪除。
- onRemoveCallback:表示快取刪除資料物件時呼叫的時間,一般用作通知程式。
特別有一點要提一下,絕對到期和可調到期只能指定一個,
使用絕對到期,則可調到期值必須為System.Web.Caching.Cache.NoSlidingExpiration,禁用可調到期。
反之,使用可調到期,則絕對到期的值必須為System.Web.Caching.Cache.NoAbsoluteExpiration,禁用絕對到期。
Insert方法和Add方法的引數是一樣的,不過Insert方法提供了更多的過載,如果你不提供某個值,那這個值就會被設定為預設值。
下面的例子演示了Cache的基本用法:
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Cache["League"] = "NBA";//指定了Key與Value,其他引數均為預設值 Cache["League"] = "CBA";//更新快取項內容方法,同上 ArrayList player = new ArrayList(); player.Add("JohnConnor"); player.Add("YaoMing"); player.Add("KobeBryant"); //使用Add方法新增一個快取項,Key為"Player",值為player物件,可調到期10分鐘,優先順序Normal,無回撥委託 Cache.Add("Player", player, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null); player[0] = "MichaelJordan"; Cache.Insert("Player", player);//Insert方法可以用來插入快取項或更新其內容,這裡使用了最簡單的過載 Response.Write(Cache["Player"].GetType().Name + "</br>");//GetType方法可以來獲取快取項內容的型別 Response.Write(Cache.Get("League").ToString() + "</br>");//Get方法來根據Key獲取Value IDictionaryEnumerator mycache = Cache.GetEnumerator();//使用GetEnumerator方法來遍歷快取項 while (mycache.MoveNext()) Response.Write(mycache.Key + "</br>"); Cache.Remove("League");//移除Key為"League"的快取項 } }
程式碼中使用了ArrayList,所有別忘記了新增”System.Collections“名稱空間的引用,當然使用Cache,別忘記了新增”System.Web.Caching“.
4.屬性詳解
Cache類的屬性主要用來獲取快取資料的一些基本資訊,這裡主要介紹Count和Item屬性。
Count用來獲取快取中所有快取項的總數:
Response.Write(Cache.Count);//快取項總數
Item用於返回制定項的內容,前面其實已經演示過了,一般繼承”IEnumerable“介面的類都有這樣的屬性,使用[]來包裝,用法如下:
Response.Write(Cache["League"]);
三,典型應用,實現資料快取的快速讀取
Cache主要用來快取使用頻率高且不需經常更新的資料。我們來做一個球員列表的快取,為了演示方便,假設不從資料庫中讀取資料,而是存在一個ArrayList物件中。
1.首先在開啟VisualStudio建立一個ASP.NET網站,命名為”JohnConnor.CacheSample“。
2.開啟預設生成的Default.aspx頁,在設計檢視中新增一個下拉列表框和一個按鈕。
3.切換到頁面的程式碼檢視,不要忘記新增名稱空間的引用喔。
using System.Collections; using System.Web.Caching;
4.在”Page_Loda“事件中判斷是否存在球員列表快取,如果沒有,則將球員列表新增到快取中。詳細程式碼如下:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { ArrayList player = new ArrayList(); player.Add("JohnConnor"); player.Add("YaoMing"); player.Add("KobeBryant"); if (Cache["Player"] == null)//如果沒有快取就新增快取 { Cache.Add("Player", player, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10), CacheItemPriority.Normal, null); } } }
5.然後我們在按鈕的雙擊事件中判斷是否有球員列表的快取,有則顯示列表內容,沒有則清空下拉框:
protected void Button1_Click(object sender, EventArgs e) { if (Cache["Player"] != null)//判斷快取是否失效 { //快取未失效則取出球員列表快取 DropDownList1.DataSource = Cache["Player"] as ArrayList; DropDownList1.DataBind(); } else { DropDownList1.Items.Clear();//快取失效則清空列表 } }
現在F5執行程式,因為我們設定的是可調到期10秒,可就是說距離最後一次訪問10秒後,快取就會失效。
我們在一開始10秒內點選按鈕,球員列表就會被繫結到下拉框。
但之後的10秒內無動作,再點選的話,下拉框就會被清空。因為快取已經失效了。
這一篇是快取管理的第一篇,我們介紹了System.Web.Caching名稱空間和其下Cache類的使用方法,並沒有涉及快取依賴的內容。
當實際資料改變的時候,如果快取不發生改變,那是很糟糕的事情,隨後的兩篇將會介紹通過依賴項來實現快取資料的即時更新。希望大家捧場。