深入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類的使用方法,並沒有涉及緩存依賴的內容。

  當實際數據改變的時候,如果緩存不發生改變,那是很糟糕的事情,隨后的兩篇將會介紹通過依賴項來實現緩存數據的即時更新。希望大家捧場。


免責聲明!

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



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