日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web缓存技术

發(fā)布時(shí)間:2023/12/13 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web缓存技术 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本章導(dǎo)讀

緩存主要是為了提高數(shù)據(jù)的讀取速度。因?yàn)榉?wù)器和應(yīng)用客戶端之間存在著流量的瓶頸,所以讀取大容量數(shù)據(jù)時(shí),使用緩存來直接為客戶端服務(wù),可以減少客戶端與服務(wù)器端的數(shù)據(jù)交互,從而大大提高程序的性能。

本章從緩存所在的命名空間“System.Web.Caching”開始,詳細(xì)介紹框架提供的緩存類和操作方法,主要涉及簡(jiǎn)單數(shù)據(jù)的緩存、數(shù)據(jù)緩存依賴和數(shù)據(jù)庫緩存依賴三個(gè)技術(shù)要點(diǎn),最后演示一個(gè)完全使用緩存實(shí)現(xiàn)數(shù)據(jù)讀取的實(shí)例。講解流程如圖16-1所示。


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

16.1? System.Web.Caching簡(jiǎn)介

本節(jié)從緩存命名空間的總體簡(jiǎn)介和組成結(jié)構(gòu)入手,從整體上對(duì)System.Web.Caching進(jìn)行概述。

16.1.1? System.Web.Caching概述

System.Web.Caching是用來管理緩存的命名空間。緩存就是將服務(wù)器端的數(shù)據(jù)暫時(shí)保存在客戶端,方便用戶的讀取。緩存命名空間的父級(jí)空間是“System.Web”,由此可以看出,緩存通常用于Web網(wǎng)站的開發(fā),包括在B/S項(xiàng)目中的開發(fā)。緩存的設(shè)計(jì)主要是考慮到網(wǎng)絡(luò)帶寬可能會(huì)延緩數(shù)據(jù)的提交和回發(fā),如果將數(shù)據(jù)保存在客戶端,用戶可以直接從客戶端讀取數(shù)據(jù),這樣數(shù)據(jù)就是從本地提取的,不會(huì)再受網(wǎng)絡(luò)的影響。

System.Web.Caching命名空間提供與緩存有關(guān)的所有操作類,具體包括哪些類將在下一節(jié)詳細(xì)介紹。

16.1.2? System.Web.Caching命名空間內(nèi)的類組成

緩存命名空間主要提供三種操作:緩存數(shù)據(jù)對(duì)象、對(duì)象的緩存依賴和數(shù)據(jù)庫的緩存依賴。其中緩存任何對(duì)象都使用一個(gè)類Cache,但當(dāng)緩存發(fā)生改變時(shí),普通對(duì)象和數(shù)據(jù)庫對(duì)象的依賴處理不同。

圖16-2羅列的是在三層結(jié)構(gòu)中緩存的部署情況。兩個(gè)依賴類CacheDependency和SqlCache Dependency主要更改發(fā)生變化的緩存數(shù)據(jù),起到通知的作用。當(dāng)數(shù)據(jù)沒有被緩存時(shí),使用Cache類進(jìn)行添加。

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

?

圖16-2? 三層結(jié)構(gòu)中緩存的部署圖

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

????

????

Cache

對(duì)緩存對(duì)象的編輯類,其操作包括緩存的增、刪、改

CacheDependency

基本緩存對(duì)象的依賴,當(dāng)基本對(duì)象發(fā)生變化時(shí),更新緩存內(nèi)容

SqlCacheDependency

數(shù)據(jù)庫緩存對(duì)象的依賴,當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)變化時(shí),更新緩存內(nèi)容

16.2? 管理緩存的類:Cache類

Cache類用來存儲(chǔ)數(shù)據(jù)對(duì)象,并提供方法對(duì)這些對(duì)象進(jìn)行編輯。本節(jié)主要介紹Cache類包含的方法,以及如何使用這些方法實(shí)現(xiàn)數(shù)據(jù)對(duì)象的緩存。

16.2.1? 功能說明

Cache類屬于字典類,其根據(jù)一定的規(guī)則存儲(chǔ)用戶需要的數(shù)據(jù),這些數(shù)據(jù)的類型不受限制,可以是字符串、數(shù)組、數(shù)據(jù)表、Dataset和哈希表等。

使用Cache類的優(yōu)點(diǎn)是當(dāng)緩存的數(shù)據(jù)發(fā)生變化時(shí),Cache類會(huì)讓數(shù)據(jù)失效,并實(shí)現(xiàn)緩存數(shù)據(jù)的重新添加,然后通知應(yīng)用程序,報(bào)告緩存的及時(shí)更新。

16.2.2? 語法定義

Cache類的語法定義如下:

public sealed class Cache : IEnumerable

通過其定義可以發(fā)現(xiàn),Cache類是“sealed”定義的類,表示此類被密封,不能被繼承。同時(shí)Cache類還繼承了IEnumerable接口,表示允許對(duì)集合中的數(shù)據(jù)進(jìn)行枚舉操作。

緩存的生命周期隨著應(yīng)用程序域的活動(dòng)結(jié)束而終止,也就是說只要應(yīng)用程序域依然處于活動(dòng)狀態(tài),緩存就會(huì)一直保持,因?yàn)槊總€(gè)應(yīng)用程序域都會(huì)創(chuàng)建一個(gè)緩存實(shí)例。此實(shí)例的信息通過HttpContext對(duì)象的Cache屬性或Page對(duì)象的Cache屬性獲取。

下面的代碼演示如何將數(shù)組數(shù)據(jù)添加到緩存中:

ArrayList myarray = new ArrayList();??????? //創(chuàng)建數(shù)組數(shù)據(jù)

myarray.Add("1.學(xué)習(xí)園地");

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

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

Cache.Add("Category", myarray);??????? //將數(shù)組添加到緩存中

16.2.3? 方法詳解

Cache類的方法主要提供對(duì)緩存數(shù)據(jù)的編輯操作,如增、刪、改等。其中最常用的方法及其說明如表16-2所示。

表16-2? Cache類的主要方法及其說明

????

????

Add

將數(shù)據(jù)添加到Cache對(duì)象

Insert

Cache中插入數(shù)據(jù)項(xiàng),可用于修改已經(jīng)存在的數(shù)據(jù)緩存項(xiàng)

Remove

移除Cache對(duì)象中的緩存數(shù)據(jù)項(xiàng)

Get

Cache對(duì)象中獲取指定的數(shù)據(jù)項(xiàng),注意返回的是Object類型,需要進(jìn)行類型轉(zhuǎn)換

GetType

Cache對(duì)象中獲取數(shù)據(jù)項(xiàng)的類型,判斷數(shù)據(jù)類型后,方便進(jìn)行轉(zhuǎn)換

GetEnumerator

循環(huán)訪問Cache對(duì)象中的緩存數(shù)據(jù)項(xiàng)。注意其返回類型是“IDictionaryEnumerator

技巧:要想修改緩存數(shù)據(jù),只需要重新為緩存賦值即可。

最需要注意的是Add方法,其使用語法如下:

public Object Add (

???? string key,

???? Object value,

???? CacheDependency dependencies,

???? DateTime absoluteExpiration,

???? TimeSpan slidingExpiration,

???? CacheItemPriority priority,

???? CacheItemRemovedCallback onRemoveCallback

)

在使用Add方法時(shí),以上7個(gè)參數(shù)是必需的,其代表意義如下:

— 參數(shù)“key”代表緩存數(shù)據(jù)項(xiàng)的鍵值,必須是唯一的。

— 參數(shù)“value”代表緩存數(shù)據(jù)的內(nèi)容,可以是任意類型。

— 參數(shù)“dependencies”表示緩存的依賴項(xiàng),也就是此項(xiàng)的更改意味著緩存內(nèi)容已經(jīng)過期。如果沒有依賴項(xiàng),可將此值設(shè)置為NULL。

— 參數(shù)“absoluteExpiration”是日期型數(shù)據(jù),表示緩存過期的時(shí)間,.NET 2.0提供的緩存在過期后是可以使用的,能使用多長時(shí)間,就看這個(gè)參數(shù)的設(shè)置。

— 參數(shù)“slidingExpiration”的類型表示一段時(shí)間間隔,表示緩存參數(shù)將在多長時(shí)間以后被刪除,此參數(shù)與absoluteExpiration參數(shù)相關(guān)聯(lián)。

— 參數(shù)“priority”表示撤銷緩存的優(yōu)先值,此參數(shù)的值取自枚舉變量“CacheItemPriority”,優(yōu)先級(jí)低的數(shù)據(jù)項(xiàng)將先被刪除。此參數(shù)主要用在緩存退出對(duì)象時(shí)。

— 參數(shù)“onRemoveCallback”表示緩存刪除數(shù)據(jù)對(duì)象時(shí)調(diào)用的事件,一般用做通知程序。

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

??? protected void Page_Load(object sender, EventArgs e)

??? {

??????? ArrayList myarray = new ArrayList();???????? //創(chuàng)建數(shù)組數(shù)據(jù)

??????? myarray.Add("1.學(xué)習(xí)園地");

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

??????? myarray.Add("3.幫助");

??????? //將數(shù)組添加到緩存中——使用Add方法

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

??????? myarray[1] = "2.交流園地";??????? ???????????? //修改數(shù)組數(shù)據(jù) ?

?????? ?Cache.Insert("Category", myarray);?? ??????? //使用Insert方法修改緩存數(shù)據(jù)

??????? string tmpStr = "這是一個(gè)臨時(shí)數(shù)據(jù)";

??????? Cache["tmpdata"] = tmpStr;

??????? //使用Get方法獲取緩存數(shù)據(jù)

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

??????? Cache["tmpdata"] = "這是一個(gè)臨時(shí)字符串";???? ??? //重新為緩存賦值的技巧

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

??????? //使用GetType方法判斷緩存數(shù)據(jù)的類型

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

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

??????? //使用GetEnumerator方法遍歷緩存中的數(shù)據(jù)

??????? IDictionaryEnumerator mycache = Cache.GetEnumerator();

??????? while (mycache.MoveNext())

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

?????? ?Cache.Remove("tmpdata");//使用Remove方法移除緩存的臨時(shí)數(shù)據(jù)

}

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

上述代碼的運(yùn)行結(jié)果如下:

這是一個(gè)臨時(shí)數(shù)據(jù)

這是一個(gè)臨時(shí)字符串

類型是數(shù)組這是一個(gè)臨時(shí)字符串

System.Collections.ArrayList

其中在讀取類型為ArrayList的數(shù)據(jù)時(shí),由于沒有進(jìn)行類型轉(zhuǎn)換,所以取出的是類型為“System.Collections.ArrayList”的對(duì)象。本書會(huì)在本節(jié)最后的實(shí)例中介紹如何讀取數(shù)組的詳細(xì)內(nèi)容。

16.2.4? 屬性詳解

Cache類的屬性主要用來獲取緩存數(shù)據(jù)的一些基本信息,如緩存的項(xiàng)總數(shù)、指定位置的緩存項(xiàng)等。本書主要介紹兩個(gè)屬性:Count和Item。

Count用來獲取緩存中所有的項(xiàng)的總數(shù)。使用方法如下:

Response.Write(Cache.Count);

Item用于返回指定項(xiàng)的內(nèi)容,一般繼承“IEnumerable”接口的類都有這樣的屬性,注意項(xiàng)需要使用“[ ]”包裝。其使用方法如下:

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

16.2.5? 典型應(yīng)用:實(shí)現(xiàn)數(shù)據(jù)的緩存快速讀取功能

Cache主要用來緩存使用頻率高且不需經(jīng)常更新的數(shù)據(jù)。本例實(shí)現(xiàn)一個(gè)目錄列表的緩存。為了簡(jiǎn)便,列表的內(nèi)容并沒有從數(shù)據(jù)庫中讀取,而是保存在一個(gè)ArrayList對(duì)象中。

本例的目的是將目錄列表填充到下拉框中,當(dāng)緩存失效后,目錄列表的內(nèi)容為空。演示的步驟如下所述。

??在VS2005中創(chuàng)建一個(gè)網(wǎng)站,命名為“CacheSample”。

??打開默認(rèn)生成的Default.aspx頁,在其中添加一個(gè)下拉列表框和一個(gè)按鈕。

??按F7鍵切換到頁面的代碼視圖。不要忘記對(duì)命名空間的引用,代碼如下:

using System.Web.Caching;

using System.Collections;

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

protected void Page_Load(object sender, EventArgs e)

{

??? if (!Page.IsPostBack)

??? {

?????? ArrayList myarray = new ArrayList();//假設(shè)ArrayList的內(nèi)容來自數(shù)據(jù)庫

??????? myarray.Add("古代歷史");

??????? myarray.Add("當(dāng)代文學(xué)");

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

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

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

??????? {

??????????? //如果緩存不存在,則添加——保存時(shí)間是5秒

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

??????????????? TimeSpan.Zero, CacheItemPriority.Normal, null);

??????? }

??? }

}

??回到設(shè)計(jì)視圖,雙擊按鈕控件,切換到按鈕的事件代碼中。

??在按鈕的雙擊事件中,需要判斷是否有目錄的緩存,有則在下拉框中顯示目錄內(nèi)容,沒有則清空下拉框。詳細(xì)代碼如下:

protected void Button1_Click(object sender, EventArgs e)

{

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

??? {

??????? //如果沒有失效,則取出緩存的列表,注意類型的轉(zhuǎn)換。

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

??????? DropDownList1.DataBind();

??? }

??? else

??? {

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

??? }

}

??按Ctrl+S組合鍵保存所有的代碼,再按F5鍵運(yùn)行程序。在5秒以內(nèi)如果單擊按鈕,則正常顯示目錄列表,如果超過5秒,則緩存對(duì)象已經(jīng)不存在,所以下拉列表框的內(nèi)容為空。

本節(jié)主要介紹了Cache類的使用方法,其中并沒有涉及緩存依賴內(nèi)容,即當(dāng)實(shí)際數(shù)據(jù)改變時(shí),緩存是否隨著改變。下一節(jié)將通過學(xué)習(xí)“CacheDependency”類了解緩存依賴的詳細(xì)實(shí)現(xiàn)。

16.3? 緩存依賴類:CacheDependency類

CacheDependency類是架設(shè)在Cache類和實(shí)際數(shù)據(jù)之間的橋梁。本節(jié)將詳細(xì)介紹如何利用CacheDependency類實(shí)現(xiàn)數(shù)據(jù)緩存的及時(shí)更新。

16.3.1? 功能說明

CacheDependency類被稱為是緩存依賴類,其具體意義表現(xiàn)在當(dāng)緩存對(duì)象的實(shí)際數(shù)據(jù)發(fā)生改變時(shí),它能及時(shí)通知緩存對(duì)象。例如緩存對(duì)象“Category”保存的是一個(gè)XML文件的數(shù)據(jù),如果XML文件發(fā)生了變化,那么系統(tǒng)通過CacheDependency類就會(huì)及時(shí)更新緩存對(duì)象“Category”的內(nèi)容,這樣就能保證用戶讀取的永遠(yuǎn)是最新的數(shù)據(jù)。

16.3.2? 語法定義

CacheDependency類的語法定義如下:

public class CacheDependency : IDisposable

其中繼承了接口“IDisposable”,此接口主要用來定義釋放分配的非托管資源的方法。繼承此接口必須實(shí)現(xiàn)方法Dispose,以實(shí)現(xiàn)資源的釋放。

CacheDependency類的構(gòu)造函數(shù)實(shí)現(xiàn)了8個(gè)重載,下面的代碼列出了這些重載的函數(shù),并詳細(xì)說明了各函數(shù)的參數(shù)。了解這些函數(shù)就可以知道CacheDependency究竟能為緩存帶來什么優(yōu)勢(shì)。

??? //假設(shè)緩存的來源文件是當(dāng)前目錄下的data.xml文件

??? //緩存依賴的文件路徑

??? CacheDependency mydep = new CacheDependency("data.xml");

??? //緩存依賴的文件可以有多個(gè)

??? CacheDependency mydep1=new CacheDependency(new string []{"data.xml","data1.xml"});

??? //檢查緩存依賴更改的依據(jù)時(shí)間

??? CacheDependency mydep2 = new CacheDependency("data.xml", DateTime.Now);

??? //檢查多個(gè)依賴文件更改的依據(jù)時(shí)間

??? CacheDependency mydep3 = new CacheDependency(new string[] { "data.xml", "data1.xml" }, DateTime.Now);

??? //檢查依賴多個(gè)文件,也依賴多個(gè)緩存鍵值

??? CacheDependency mydep4 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

??????? new string[] { "Category", "Category1" });

??? //關(guān)聯(lián)依賴,還可以依賴于另一個(gè)文件緩存依賴

??? CacheDependency mydep5 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

??????? new string[] { "Category", "Category1" }, mydep);

??? //文件和鍵值上次修改的依據(jù)時(shí)間

??? CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

??????? new string[] { "Category", "Category1" }, DateTime.Now);

??? //文件、另一個(gè)緩存依賴和鍵值上次修改的依據(jù)時(shí)間

??? CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

new string[] { "Category", "Category1" }, mydep,DateTime.Now);

16.3.3? 方法和屬性

雖然CacheDependency類完成了很重要的功能,但其組成結(jié)構(gòu)卻比較簡(jiǎn)單,主要有兩個(gè)屬性和一個(gè)方法。

— 屬性“HasChanged”:判斷CacheDependency對(duì)象是否已更改。

— 屬性“UtcLastModified”:返回上次依賴項(xiàng)的修改日期

— 方法“Dispose”:釋放CacheDependency對(duì)象所占有的資源。因?yàn)榫彺骖惱^承了接口“IDispose”,所以必須實(shí)現(xiàn)此方法。

由于緩存類的構(gòu)成比較簡(jiǎn)單,本節(jié)并沒有給出演示代碼,屬性和方法的使用將在下一節(jié)的實(shí)例中演示。

注意:只有Cache類的Insert和Add方法才可以為緩存添加依賴項(xiàng)。

16.3.4? 典型應(yīng)用:用CacheDependency獲取最新的數(shù)據(jù)

本例主要演示如何使用CacheDependency類實(shí)現(xiàn)數(shù)據(jù)的及時(shí)更新。實(shí)例中使用一個(gè)GridView控件顯示XML文件的數(shù)據(jù),當(dāng)XML文件的數(shù)據(jù)發(fā)生改變時(shí),客戶端可以及時(shí)更新。其實(shí)現(xiàn)的功能如圖16-3所示。

?

圖16-3? 用CacheDependency獲取最新數(shù)據(jù)的功能實(shí)現(xiàn)圖

演示的詳細(xì)步驟如下所述。

?????打開VS2005,創(chuàng)建一個(gè)網(wǎng)站,命名為“CacheDependencySample”。

?????在網(wǎng)站根目錄下,添加一個(gè)XML文件,用來為控件提供數(shù)據(jù),內(nèi)容如下:

<?xml version="1.0" encoding="utf-8" ?>

<book>

???? <bookinfo>

???????? <name>英國古代</name>

???????? <price>28.00</price>

???? </bookinfo>

???? <bookinfo>

???????? <name>中國歷史</name>

???????? <price>20.00</price>

???? </bookinfo>

</book>

?????打開默認(rèn)生成的Default.aspx頁,添加一個(gè)GridView控件和一個(gè)按鈕控件。

?????按F7鍵切換到窗體的代碼視圖,在Page_Load事件中書寫生成緩存的代碼。詳細(xì)內(nèi)容如下:

private static CacheDependency mydepen;

protected void Page_Load(object sender, EventArgs e)

{

??? if (!IsPostBack)

??? {

??????? //創(chuàng)建XML數(shù)據(jù)源

??????? DataSet myds = new DataSet();

??????? //數(shù)據(jù)源來自文件data.xml

??????? myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));

??????? //判斷是否存在緩存

?? ?????if (Cache["BOOKS"] == null)

??????? {

??????????? //創(chuàng)建緩存依賴

?????????? mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath

??????????????? + @"/data.xml"));

??????????? //添加緩存項(xiàng)

??????????? Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,

??????????????? CacheItemPriority.Normal, null);

??????? }

??? }

}

注意:使用XML文件讀取方法,必須添加XML操作方法所在的命名空間“System.Xml”。

?????切換回設(shè)計(jì)視圖,再雙擊按鈕控件,此時(shí)光標(biāo)停靠在按鈕的Click事件內(nèi)。在此事件內(nèi)書寫代碼,判斷XML文件的數(shù)據(jù)是否已更新,如果已更新則給出提示,并重新添加緩存依賴項(xiàng),否則直接從緩存讀取GridView控件的數(shù)據(jù)。

?????在“Button1_Click”事件內(nèi)書寫的詳細(xì)代碼如下:

protected void Button1_Click(object sender, EventArgs e)

{

??? //判斷緩存是否發(fā)生了變化

??? if (mydepen.HasChanged)

??? {

??????? Response.Write("Sorry,數(shù)據(jù)發(fā)生了變化!上次修改時(shí)間是:" + mydepen.UtcLastModified);

?? ?}

??? //判斷緩存項(xiàng)是否還在

??? if (Cache["BOOKS"] == null)

??????? {

??????? //重新設(shè)置緩存項(xiàng)

??????????? DataSet myds = new DataSet();

??????????? myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));

??????????? mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/ data.xml"));

??????? Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,

CacheItemPriority.Normal, null);

??????? }

??????? GridView1.DataSource = Cache["BOOKS"];

??????? GridView1.DataBind();

}

注意:當(dāng)XML文件發(fā)生改變后,其實(shí)緩存依賴和緩存項(xiàng)都被移除了,必須重新定義。

?????按Ctrl+S組合鍵保存代碼的修改。再按F5鍵運(yùn)行程序,單擊“獲取數(shù)據(jù)”按鈕,GridView就會(huì)顯示XML文件的內(nèi)容。

?????程序運(yùn)行正常后,在后臺(tái)修改XML文件的內(nèi)容,然后再單擊“獲取數(shù)據(jù)”按鈕,則出現(xiàn)更改數(shù)據(jù)的提示,同時(shí)GridView顯示了新的內(nèi)容。圖16-4和圖16-5是數(shù)據(jù)更改前和更改后的效果對(duì)比。

???????????????????

? ? ? ? ? ?圖16-4? 初次獲取的數(shù)據(jù)效果圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖16-5? 更改數(shù)據(jù)后的顯示效果圖

16.4? 數(shù)據(jù)庫緩存依賴類:SqlCacheDependency類

數(shù)據(jù)庫緩存依賴主要解決的是當(dāng)數(shù)據(jù)庫的內(nèi)容發(fā)生改變時(shí),如何及時(shí)通知緩存,并更新緩存中的數(shù)據(jù)的問題。本節(jié)就介紹如何使用SQL Server 2005和.NET 2.0實(shí)現(xiàn)數(shù)據(jù)庫的緩存依賴。

16.4.1? 功能說明

SqlCacheDependency類的使用需要結(jié)合SQL Server 2005數(shù)據(jù)庫,目前還沒有Oracle數(shù)據(jù)庫的緩存依賴。

16.4.2? 語法定義

SqlCacheDependency類的使用語法如下:

public class SqlCacheDependency : IDisposable

其中繼承了接口“IDisposable”,此接口主要用來定義釋放分配的非托管資源的方法。繼承此接口必須實(shí)現(xiàn)方法Dispose,用來實(shí)現(xiàn)資源的釋放。

SqlCacheDependency類主要的構(gòu)造函數(shù)如下:

public SqlCacheDependency(string database,string table)

其中參數(shù)一代表要啟用緩存的數(shù)據(jù)庫,參數(shù)二表示緩存的表。在實(shí)際使用過程中,只需要指明緩存的數(shù)據(jù)庫和表即可。

16.4.3? 方法和屬性

SqlCacheDependency類的方法和屬性同CacheDependency類相同,主要有三個(gè)。

— ?HasChanged:判斷數(shù)據(jù)庫緩存依賴是否發(fā)生了變化。

—??UtcLastModified:獲取緩存依賴上次更改的時(shí)間。

—? Dispose:釋放緩存依賴所占用的資源。

這三個(gè)成員的使用方法同CacheDependency類的成員相似,本節(jié)不再贅述。

在下節(jié)要介紹的使用實(shí)例中,將不再使用代碼的方式實(shí)現(xiàn)緩存依賴,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency參數(shù)實(shí)現(xiàn)數(shù)據(jù)庫表的緩存。如果要使用編程的方式實(shí)現(xiàn)此功能,可參考CacheDependency類的實(shí)例。

16.4.4? 使用SqlCacheDependency類的操作流程

要實(shí)現(xiàn)數(shù)據(jù)庫緩存依賴,必須結(jié)合數(shù)據(jù)庫的操作。在使用數(shù)據(jù)庫緩存依賴前,必須進(jìn)行5步操作。詳細(xì)流程如圖16-6所示。

只有具備了上述條件,才可以正常地使用數(shù)據(jù)庫緩存依賴。下一節(jié)將結(jié)合這5步操作演示如何實(shí)現(xiàn)數(shù)據(jù)庫的緩存依賴。

? ? ? ? ? ? 圖16-6? 使用數(shù)據(jù)庫緩存依賴的流程

16.4.5? 典型應(yīng)用:獲取數(shù)據(jù)庫表最新數(shù)據(jù)的實(shí)例

本例要實(shí)現(xiàn)的功能是當(dāng)數(shù)據(jù)庫的內(nèi)容發(fā)生變化時(shí),保存在緩存中的數(shù)據(jù)項(xiàng)被更新。具體演示的步驟如下所述。

?????在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)庫“testCache”。

?????在數(shù)據(jù)庫“testCache”中添加表“CacheTable”,其信息如表16-3所示。

表16-3? CacheTable表的信息

????

字段類型

????

id

int

自增長數(shù)據(jù)標(biāo)識(shí)

Name

nvarchar(20)

書名

bookPublish

nvarchar(50)

出版社

Price

decimal(6,2)

書的價(jià)格

?????為數(shù)據(jù)庫啟用緩存通知。打開“開始”|“所有程序”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”菜單命令。

???輸入如下命令,其中“-ed”和“-et”分別代表啟用緩存依賴數(shù)據(jù)庫和啟用緩存數(shù)據(jù)表。
?????????aspnet_regsql.exe -S??SqlServer服務(wù)器 -E -ed -d??數(shù)據(jù)庫名稱 -et -t??表名
???????? 注意如果使用的數(shù)據(jù)庫驗(yàn)證方式是“SQL Server身份驗(yàn)證”,則需要使用如下的啟動(dòng)命令:
???????? aspnet_regsql.exe -S??SqlServer服務(wù)器??-U <Username> -P <Password> -ed -d?數(shù)據(jù)庫名稱 -et -t 表名
??????? 輸入命令后,按回車鍵。如果執(zhí)行成功,效果如圖16-7所示。

?????打開VS2005,新建一個(gè)網(wǎng)站,命名為“SqlCacheDependency”。

?????按F5鍵運(yùn)行程序,主要目的是生成一個(gè)默認(rèn)的Web.Config文件。然后關(guān)閉運(yùn)行的程序。

?????在Web.config中配置數(shù)據(jù)庫連接字符串,代碼如下:

???? <connectionStrings>

???????? <add name="TestCacheConnectionString" connectionString="Data Source=CGJ-57F90 CCA64C\sqlexpress;Initial Catalog=testCache;Integrated Security=True" providerName= "System.

Data.SqlClient"/>

???? </connectionStrings>

??

? 圖16-7? 啟用數(shù)據(jù)庫緩存依賴成功的提示圖

????在“system.web”節(jié)點(diǎn)內(nèi),添加數(shù)據(jù)庫緩存依賴的配置,詳細(xì)代碼如下所示。注意配置中的“connectionStringName”屬性,要與前面創(chuàng)建的數(shù)據(jù)庫連接字符串的名字相對(duì)應(yīng)。

<caching>

???? <sqlCacheDependency enabled = "true" pollTime = "1000" >

???????? <databases>

????????????? <add name="testCache"

????????????? ?? connectionStringName="TestCacheConnectionString"

????????????? ?? pollTime = "1000"????? />

???????? </databases>

???? </sqlCacheDependency>

</caching>

?????按Ctrl+S組合鍵保存配置文件的更改。

?????打開默認(rèn)生成的Default.aspx頁,在設(shè)計(jì)視圖中添加一個(gè)GridView控件,用來顯示從數(shù)據(jù)庫獲取的數(shù)據(jù)。再添加一個(gè)Literal控件,主要用來顯示時(shí)間,通過時(shí)間判斷顯示的是否是緩存中的數(shù)據(jù)。

?????為GridView配置數(shù)據(jù)源。單擊其任務(wù)列表,在“選擇數(shù)據(jù)源”下拉框中,單擊“新建數(shù)據(jù)源”命令,打開數(shù)據(jù)源的配置向?qū)А?/p>

?????在打開的數(shù)據(jù)源類型窗口中,選擇“數(shù)據(jù)庫”,單擊“確定”按鈕,出現(xiàn)選擇連接字符串窗口,通過下拉列表選擇剛剛創(chuàng)建的“TestCacheConnectionString”連接串。

?????單擊“下一步”按鈕,出現(xiàn)“配置Select語句”對(duì)話框,在“列”列表框中選擇“*”,表示選中所有列。

?????單擊“下一步”按鈕出現(xiàn)測(cè)試查詢對(duì)話框,然后單擊“完成”按鈕。

?????按F7鍵切換到到代碼視圖,在“Page_Load”事件中添加如下代碼(主要是顯示當(dāng)前的時(shí)間,用來判斷是否是緩存數(shù)據(jù)):

Literal1.Text = DateTime.Now.ToString();

?????按Ctrl+S組合鍵保存當(dāng)前頁的設(shè)計(jì),再按F5鍵運(yùn)行程序。當(dāng)刷新頁面時(shí),可以看到時(shí)間是不斷變化的,這說明數(shù)據(jù)并沒有來自緩存。

?????打開Default.aspx頁,在源代碼視圖的“<@page ”行下面,添加如下所示代碼。其中使用的參數(shù)“SqlDependency”,就是用來添加數(shù)據(jù)庫緩存依賴的。

?<%@ OutputCache Duration="3600" SqlDependency="testCache:CacheTable" VaryByParam="none" %>

注意:Duration參數(shù)是表示緩存的過期時(shí)間,單位是毫秒。

?????按F5鍵運(yùn)行程序,此時(shí)再刷新頁面,發(fā)現(xiàn)當(dāng)前的時(shí)間已經(jīng)不再變化,因?yàn)檎麄€(gè)頁的數(shù)據(jù)被緩存了起來。

????此時(shí)修改數(shù)據(jù)庫的內(nèi)容,然后刷新運(yùn)行著的頁面,可以發(fā)現(xiàn),數(shù)據(jù)跟著發(fā)生了變化。這就是數(shù)據(jù)庫緩存依賴的體現(xiàn)。當(dāng)數(shù)據(jù)庫內(nèi)容更新時(shí),不管緩存的時(shí)間有沒有到,緩存的內(nèi)容都會(huì)被更新。

16.5? Session和Cache的區(qū)別

以前實(shí)現(xiàn)數(shù)據(jù)的緩存有很多種方法,有客戶端的Cookie,有服務(wù)器端的Session和Application。其中Cookie是保存在客戶端的一組數(shù)據(jù),主要用來保存用戶名等個(gè)人信息。Session則保存對(duì)話信息。Application則是保存在整個(gè)應(yīng)用程序范圍內(nèi)的信息,相當(dāng)于全局變量。通常使用最頻繁的是Session,那么Session和Cache又有什么區(qū)別呢?

本節(jié)結(jié)合使用經(jīng)驗(yàn),詳細(xì)介紹Session緩存和Cache緩存的區(qū)別。

(1)最大的區(qū)別是Cache提供緩存依賴來更新數(shù)據(jù),而Session只能依靠定義的緩存時(shí)間來判斷緩存數(shù)據(jù)是否有效。

(2)即使應(yīng)用程序終止,只要Cache.Add方法中定義的緩存時(shí)間未過期,下次開啟應(yīng)用程序時(shí),緩存的數(shù)據(jù)依然存在。而Session緩存只是存在于一次會(huì)話中,會(huì)話結(jié)束后,數(shù)據(jù)也就失效了。

(3)Session容易丟失,導(dǎo)致數(shù)據(jù)的不確定性,而Cache不會(huì)出現(xiàn)這種情況。

(4)由于Session是每次會(huì)話就被加載,所以不適宜存放大量信息,否則會(huì)導(dǎo)致服務(wù)器的性能降低。而Cache則主要用來保存大容量信息,如數(shù)據(jù)庫中的多個(gè)表。

(5)VS2005的測(cè)試版提供了將緩存保存在硬盤上的參數(shù),但正式版中取消了這個(gè)功能,估計(jì)其在以后版本中會(huì)重新實(shí)現(xiàn)。而Session目前只能保存在內(nèi)存中,對(duì)其性能有影響。

為了提高Cache的有效利用率,建議對(duì)于不經(jīng)常改動(dòng)的數(shù)據(jù)使用Cache。

16.6? 小結(jié)

本章主要介紹了如何使用System.Web.Caching命名空間下的類,主要包括以下三個(gè):Cache, CacheDependency和SqlCacheDependency。Cache類主要用來創(chuàng)建緩存項(xiàng),主要針對(duì)的是數(shù)據(jù)不經(jīng)常改變,但又使用頻繁的數(shù)據(jù)表或文件。另兩個(gè)類是.NET 2.0新添加的緩存依賴服務(wù)。通過文件依賴或數(shù)據(jù)庫依賴,可以實(shí)現(xiàn)緩存數(shù)據(jù)的及時(shí)更新。

通過本章的學(xué)習(xí),希望可以提高讀者編寫的網(wǎng)站的數(shù)據(jù)讀取速度,節(jié)約帶寬,為Web 2.0時(shí)代的到來打下堅(jiān)實(shí)的基礎(chǔ)。

?

出處:《C#實(shí)用開發(fā)參考大全》一書第16章。
參考: http://www.cnblogs.com/codecrazy/archive/2010/10/14/1851936.html

不怕范圍太大,大可以寫上[^>]*)\1\s+>

轉(zhuǎn)載于:https://www.cnblogs.com/mq0036/p/4031223.html

總結(jié)

以上是生活随笔為你收集整理的Web缓存技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。