深入System.Web.Caching名稱空間 教你Hold住快取管理(二)
本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會:
- 第一篇-如何實現簡單的資料快取
- 第二篇-快取從檔案中讀取的資料,並通過檔案依賴實現快取資料的及時更新
- 第三篇-快取資料庫中的整張表,並通過資料庫依賴實現快取資料的及時更新
在學習了第一篇Cache類的用法後,下面我們來繼續看看如果快取從檔案中讀取的的資料,並通過快取依賴類CacheDependency實現快取資料的及時更新。
一,快取依賴類CacheDependency
CacheDependency類是架設在Cache類和實際資料之前的橋樑,其具體的意義是當快取物件的實際資料發生改變的時候,它能及時的通知快取物件。
假如快取物件”Player“儲存的是一個XML檔案的資料,如果XML檔案發生了變化,那麼系統通過CacheDependency類就會及時的更新快取物件的內容,保證使用者讀取的永遠是最新的資料。
1.語法定義
CacheDependency類的語法定義如下:
public class CacheDependency : IDisposable
繼承了介面”IDisposable“,此介面主要用來定義釋放分配的非託管資源的方法。繼承此介面的類,必須實現方法Dispone ,實現資源的釋放。
繼承這個介面有什麼好處呢,看下面一段程式碼:
using (CacheDependency mydep = new CacheDependency("player.xml")) { //dosomething }
這樣使用using來建立一個新物件,在出了這個作用域之後,即”{}“內的程式碼執行完畢,系統就會自動呼叫Dispone來釋放該物件佔用的資源。
經常開啟資料庫連結又懶得去顯式關閉的同學,對此應該比較熟悉。
CacheDependency類建構函式實現了8個對外公開的過載,雖然全部列出麻煩了點,但為了知道CacheDependency究竟能為快取帶來什麼優勢,我們來細說一下每個過載。
1 public CacheDependency(string filename); 2 public CacheDependency(string[] filenames);
3 public CacheDependency(string[] filenames, string[] cachekeys);
4 public CacheDependency(string filename, DateTime start);
5 public CacheDependency(string[] filenames, DateTime start);
6 public CacheDependency(string[] filenames, string[] cachekeys, CacheDependency dependency);//dependency引數宣告此依賴項依賴另外一個CacheDependency的例項
7 public CacheDependency(string[] filenames, string[] cachekeys, DateTime start);
8 public CacheDependency(string[] filenames, string[] cachekeys, CacheDependency dependency, DateTime start);
(1)監視檔案或目錄<引數filename>更改情況,當該資源發生變化時,與此依賴項物件關聯的快取物件將過期,並從快取中移除。
(2)監視一組檔案或目錄<引數filenames>更改情況,當這些資源中任何一個變化時,處理同上。
(3)監視一組檔案或目錄<引數filenames>的同時,也監視一組快取鍵<引數cachekeys>的更改情況,當這些資源中任何一個變化時,處理同上。
這三個是最基本的建構函式,其他的過載只是聲明瞭此依賴項所依賴另外一個CacheDependency的例項<引數dependency>,
或是監視物件上次修改日期所依據的日期和時間<引數start>。
2.方法和屬性
CacheDependency的組成結構與它重要的功能比起來,較為簡單。主要有兩個屬性和一個方法:
- 屬性”HasChanged“:判斷CacheDependency物件是否已更改。
- 屬性”UtcLastModified“:返回上次依賴項的修改日期。
- 方法”Dispose“:釋放CacheDependency物件佔用的資源。
我們在最後的應用的例子中來了解這些屬性和方法的使用。
二,典型應用:用CacheDependency獲取最新的資料
我們這裡需要使用CacheDependency類來實現資料的及時更新。演示中使用GridView來顯示一個XML檔案的資料,當XML檔案資料發生改變時,客戶端可以及時更新。
先來看下實現的過程圖解:
下面我們來實現這個過程。
1,首先我們使用VisualStudio建立一個ASP.NET網站,命名為”JohnConnor.CacheDependencySample“,並在根目錄下新增一個檔名為players的XML檔案:
<?xml version="1.0" encoding="utf-8" ?> <playerslist> <player> <name>KobeByrant</name> <height>1.98m</height> </player> <player> <name>AllenIverson</name> <height>1.83m</height> </player> </playerslist>
2,我們開啟預設生成的Default .aspx頁,在設計檢視中新增一個GridView和按鈕和一個Label控制元件。然後在程式碼檢視的Page_Load事件中新增生成快取的程式碼:
private static CacheDependency mydepen; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { DataSet myds = new DataSet();//建立XML資料來源 myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/players.xml"));//資料來源來自檔案players.xml if (Cache["Players"] == null)//判斷快取是否存在 { mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/players.xml"));//建立快取依賴 //新增快取項 Cache.Add("Players", myds, mydepen, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null); } } }
3,最後我們在按鈕的Click事件裡判斷實際資料是否被修改,如果修改則重新生成快取和依賴,並繫結資料:
protected void Button1_Click(object sender, EventArgs e) { if (mydepen.HasChanged)//判斷實際資料是否發生了變化 { Label1.Text="球員列表已經改變,上一次修改時間:" + mydepen.UtcLastModified; DataSet myds = new DataSet();//建立XML資料來源 myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/players.xml"));//資料來源來自檔案players.xml mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/players.xml"));//重新建立快取依賴 //重新新增快取項 Cache.Add("Players", myds, mydepen, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null); } GridView1.DataSource = Cache["Players"]; GridView1.DataBind(); }
現在F5執行,點選按鈕就會得到XML檔案中的資料:
然後我們對XML檔案進行修改,新增一個球員,點選按鈕,就會重新整理快取,顯示最新的資料:
雖然我的名字出現在這裡有點突兀哈哈,請大家不要噴我。
這一篇我們解決了使用檔案依賴來進行快取及時更新的問題。
下一篇我們要解決的問題是當資料庫內容發生改變時,如何及時通知快取,並更新快取中的資料,請大家多多支援。