深入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文件進行修改,添加一個球員,點擊按鈕,就會刷新緩存,顯示最新的數據:

  

  雖然我的名字出現在這里有點突兀哈哈,請大家不要噴我。

  這一篇我們解決了使用文件依賴來進行緩存及時更新的問題。

  下一篇我們要解決的問題是當數據庫內容發生改變時,如何及時通知緩存,並更新緩存中的數據,請大家多多支持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM