深入System.Web.Caching命名空間 教你Hold住緩衝管理(一)

來源:互聯網
上載者:User

本文分三篇,從緩衝所在命名空間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類的使用方法,並沒有涉及緩衝依賴的內容。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.