C# 緩衝技術

來源:互聯網
上載者:User

標籤:

緩衝主要是為了提高資料的讀取速度。因為伺服器和應用用戶端之間存在著流量的瓶頸,所以讀取大容量資料時,使用緩衝來直接為用戶端服務,可以減少用戶端與伺服器端的資料互動,從而大大提高程式的效能。

本章從緩衝所在的命名空間“System.Web.Caching”開始,詳細介紹架構提供的緩衝類和操作方法,主要涉及簡單資料的緩衝、資料緩衝依賴和資料庫緩衝依賴三個技術要點,最後示範一個完全使用緩衝實現資料讀取的執行個體。講解流程16-1所示。

圖16-1 緩衝命名空間的講解流程

16.1 System.Web.Caching簡介

本節從緩衝命名空間的總體簡介和組成結構入手,從整體上對System.Web.Caching進行概述。

16.1.1 System.Web.Caching概述

System.Web.Caching是用來管理緩衝的命名空間。緩衝就是將伺服器端的資料暫時儲存在用戶端,方便使用者的讀取。緩衝命名空間的父級空間是“System.Web”,由此可以看出,緩衝通常用於Web網站的開發,包括在B/S項目中的開發。緩衝的設計主要是考慮到網路頻寬可能會延緩資料的提交和回傳,如果將資料儲存在用戶端,使用者可以直接從用戶端讀取資料,這樣資料就是從本地提取的,不會再受網路的影響。

System.Web.Caching命名空間提供與緩衝有關的所有操作類,具體包括哪些類將在下一節詳細介紹。

16.1.2 System.Web.Caching命名空間內的類組成

緩衝命名空間主要提供三種操作:快取資料對象、對象的緩衝依賴和資料庫的緩衝依賴。其中緩衝任何對象都使用一個類Cache,但當緩衝發生改變時,普通對象和資料庫物件的依賴處理不同。

圖16-2羅列的是在三層結構中緩衝的部署情況。兩個依賴類CacheDependency和SqlCache Dependency主要更改發生變化的快取資料,起到通知的作用。當資料沒有被緩衝時,使用Cache類進行添加。

下面根據圖16-2的部署,來介紹圖中使用的緩衝類。這些類的說明如表16-1所示。

 

圖16-2 三層結構中緩衝的部署圖

表16-1 緩衝命名空間中的類及其說明

類名

說明

Cache

對緩衝對象的編輯類,其操作包括緩衝的增、刪、改

CacheDependency

基本緩衝對象的依賴,當基本對象發生變化時,更新緩衝內容

SqlCacheDependency

資料庫緩衝對象的依賴,當資料庫中的資料變化時,更新緩衝內容

16.2 管理緩衝的類:Cache類

Cache類用來儲存資料對象,並提供方法對這些對象進行編輯。本節主要介紹Cache類包含的方法,以及如何使用這些方法實現資料對象的緩衝。

16.2.1 功能說明

Cache類屬於字典類,其根據一定的規則儲存使用者需要的資料,這些資料的類型不受限制,可以是字串、數組、資料表、Dataset和雜湊表等。

使用Cache類的優點是當緩衝的資料發生變化時,Cache類會讓資料失效,並實現快取資料的重新添加,然後通知應用程式,報告緩衝的及時更新。

16.2.2 文法定義

Cache類的文法定義如下:

public sealed class Cache : IEnumerable

通過其定義可以發現,Cache類是“sealed”定義的類,表示此類被密封,不能被繼承。同時Cache類還繼承了IEnumerable介面,表示允許對集合中的資料進行枚舉操作。

緩衝的生命週期隨著應用程式定義域的活動結束而終止,也就是說只要應用程式定義域依然處於活動狀態,緩衝就會一直保持,因為每個應用程式定義域都會建立一個緩衝執行個體。此執行個體的資訊通過HttpContext對象的Cache屬性或Page對象的Cache屬性擷取。

下面的代碼示範如何將數組資料添加到緩衝中:

ArrayList myarray = new ArrayList(); //建立數組資料

myarray.Add("1.學習園地");

myarray.Add("2.交流論壇");

myarray.Add("3.協助");

Cache.Add("Category", myarray); //將數組添加到緩衝中

16.2.3 方法詳解

Cache類的方法主要提供對快取資料的編輯操作,如增、刪、改等。其中最常用的方法及其說明如表16-2所示。

表16-2 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

)

在使用Add方法時,以上7個參數是必需的,其代表意義如下:

— 參數“key”代表快取資料項的索引值,必須是唯一的。

— 參數“value”代表快取資料的內容,可以是任意類型。

— 參數“dependencies”表示緩衝的依賴項,也就是此項的更改意味著緩衝內容已經到期。如果沒有依賴項,可將此值設定為NULL。

— 參數“absoluteExpiration”是日期型資料,表示緩衝到期的時間,.NET 2.0提供的緩衝在到期後是可以使用的,能使用多長時間,就看這個參數的設定。

— 參數“slidingExpiration”的類型表示一段時間間隔,表示緩衝參數將在多長時間以後被刪除,此參數與absoluteExpiration參數相關聯。

— 參數“priority”表示撤銷緩衝的優先值,此參數的值取自枚舉變數“CacheItemPriority”,優先順序低的資料項目將先被刪除。此參數主要用在緩衝退出對象時。

— 參數“onRemoveCallback”表示緩衝刪除資料對象時調用的事件,一般用做通知程式。

下面的代碼示範了如何應用Cache類的這些方法。在使用本代碼時需要注意,代碼中使用了Arraylist對象,所以需要添加對命名空間“System.Collections”的引用,同時使用Cache類別忘記了添加命名空間“System.Web.Caching”。

protected void Page_Load(object sender, EventArgs e)

{

ArrayList myarray = new ArrayList(); //建立數組資料

myarray.Add("1.學習園地");

myarray.Add("2.交流論壇");

myarray.Add("3.協助");

//將數組添加到緩衝中——使用Add方法

Cache.Add("Category", myarray, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.Normal, null);

myarray[1] = "2.交流園地"; //修改數組資料

Cache.Insert("Category", myarray); //使用Insert方法修改快取資料

string tmpStr = "這是一個臨時資料";

Cache["tmpdata"] = tmpStr;

//使用Get方法擷取快取資料

Response.Write(Cache.Get("tmpdata").ToString()+"<br/>");/

Cache["tmpdata"] = "這是一個臨時字串"; //重新為緩衝賦值的技巧

Response.Write(Cache.Get("tmpdata").ToString() + "<br/>");

//使用GetType方法判斷快取資料的類型

if (Cache["Category"].GetType().Name == "ArrayList")

Response.Write("類型是數組");

//使用GetEnumerator方法遍曆緩衝中的資料

IDictionaryEnumerator mycache = Cache.GetEnumerator();

while (mycache.MoveNext())

Response.Write(mycache.Value + "<br/>");

Cache.Remove("tmpdata");//使用Remove方法移除緩衝的臨時資料

}

技巧:在使用GetType方法時,如果要判斷類型,需要使用Object.GetType().Name屬性擷取類型的名稱。

上述代碼的運行結果如下:

這是一個臨時資料

這是一個臨時字串

類型是數組這是一個臨時字串

System.Collections.ArrayList

其中在讀取類型為ArrayList的資料時,由於沒有進行類型轉換,所以取出的是類型為“System.Collections.ArrayList”的對象。本書會在本節最後的執行個體中介紹如何讀取數組的詳細內容。

16.2.4 屬性詳解

Cache類的屬性主要用來擷取快取資料的一些基本資料,如緩衝的項總數、指定位置的快取項目等。本書主要介紹兩個屬性:Count和Item。

Count用來擷取緩衝中所有的項的總數。使用方法如下:

Response.Write(Cache.Count);

Item用於返回指定項的內容,一般繼承“IEnumerable”介面的類都有這樣的屬性,注意項需要使用“[ ]”封裝。其使用方法如下:

Response.Write(Cache[“Category”].ToString());

16.2.5 典型應用:實現資料的緩衝快速讀取功能

Cache主要用來緩衝使用頻率高且不需經常更新的資料。本例實現一個目錄列表的緩衝。為了簡便,列表的內容並沒有從資料庫中讀取,而是儲存在一個ArrayList對象中。

本例的目的是將目錄列表填充到下拉框中,當緩衝失效後,目錄列表的內容為空白。示範的步驟如下所述。

在VS2005中建立一個網站,命名為“CacheSample”。

開啟預設產生的Default.aspx頁,在其中添加一個下拉式清單方塊和一個按鈕。

按F7鍵切換到頁面的程式碼檢視。不要忘記對命名空間的引用,代碼如下:

using System.Web.Caching;

using System.Collections;

在“Page_Load”事件中判斷是否存在目錄緩衝,如果沒有,則將目錄添加到緩衝中。詳細代碼如下所示,其中目錄列表的儲存時間是5秒。

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

ArrayList myarray = new ArrayList();//假設ArrayList的內容來自資料庫

myarray.Add("古代曆史");

myarray.Add("當代文學");

myarray.Add("流行小說");

myarray.Add("武俠小說");

if (Cache["Categorys"] == null) //判斷是否存在緩衝

{

//如果緩衝不存在,則添加——儲存時間是5秒

Cache.Add("Categorys", myarray, null, DateTime.Now.AddSeconds(5),

TimeSpan.Zero, CacheItemPriority.Normal, null);

}

}

}

回到設計檢視,雙擊按鈕控制項,切換到按鈕的事件代碼中。

在按鈕的雙擊事件中,需要判斷是否有目錄的緩衝,有則在下拉框中顯示目錄內容,沒有則清空下拉框。詳細代碼如下:

protected void Button1_Click(object sender, EventArgs e)

{

if (Cache["Categorys"] != null) //判斷緩衝是否失效

{

//如果沒有失效,則取出緩衝的列表,注意類型的轉換。

DropDownList1.DataSource = (ArrayList)Cache["Categorys"];

DropDownList1.DataBind();

}

else

{

DropDownList1.Items.Clear(); //如果已經失效,則清空列表

}

}

按Ctrl+S按鍵組合儲存所有的代碼,再按F5鍵運行程式。在5秒以內如果單擊按鈕,則正常顯示目錄列表,如果超過5秒,則緩衝對象已經不存在,所以下拉式清單方塊的內容為空白。

本節主要介紹了Cache類的使用方法,其中並沒有涉及緩衝依賴內容,即當實際資料改變時,緩衝是否隨著改變。下一節將通過學習“CacheDependency”類瞭解緩衝依賴的詳細實現。

C# 緩衝技術

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.