轉(zhuǎn)帖|其它|編輯:郝浩|2010-06-08 10:11:47.000|閱讀 530 次
概述:你在生成高性能網(wǎng)絡(luò)應(yīng)用程序時(shí)所遇到的一個(gè)問題就是需要避免重復(fù)。一個(gè)Cache對象允許在它們第一次被請求時(shí)在內(nèi)存中緩存項(xiàng),然后將被緩存的副本用于以后的請求。除緩存?zhèn)€別項(xiàng),如緩存中的計(jì)算結(jié)果以外,Asp.net提供一個(gè)輸出緩存可用于保存網(wǎng)頁和用戶控件。Cache對象和輸出緩存是擁有相同的角色和屬性,但它們是皆然不同的兩種對象。本文將探討Cache對象的使用問題。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
什么是Cache對象?
你在生成高性能網(wǎng)絡(luò)應(yīng)用程序時(shí)所遇到的一個(gè)問題就是需要避免重復(fù)。一個(gè)Cache對象允許在它們第一次被請求時(shí)在內(nèi)存中緩存項(xiàng),然后將被緩存的副本用于以后的請求。使用被緩存的副本允許你避免重建滿足以前請求的信息,特別是那些每次創(chuàng)建時(shí)都需占有明示的服務(wù)器上的處理器時(shí)間的命令。
除緩存?zhèn)€別項(xiàng),如緩存中的計(jì)算結(jié)果以外,Asp.net提供一個(gè)輸出緩存可用于保存網(wǎng)頁和用戶控件。Cache對象和輸出緩存是擁有相同的角色和屬性,但它們是皆然不同的兩種對象。
ASP.NET提供一個(gè)全特性的緩存引擎,用于保存和獲取信息片段。Cache對象沒有關(guān)于它所包含的的項(xiàng)的信息。Cache對象僅包含對于那些對象的引用以及提供它們的依賴項(xiàng)和設(shè)置過期策略。Cache還提供方法在相同網(wǎng)絡(luò)應(yīng)用程序的網(wǎng)頁之間傳遞值。緩存方法實(shí)現(xiàn)自動的鎖,所以,值在被多個(gè)頁并發(fā)訪問時(shí)是安全的。
那么Cache對象是如何工作的哪?
使用Cache對象的的過程是:
1. 頁面請求的項(xiàng)被標(biāo)識為已經(jīng)在Cache對象中保存。
2. ASP.NET 檢查 Cache 對象并用已緩存的版本來決定是否可用。
3. 如果緩存的版本不可用,ASP.NET 重新創(chuàng)建項(xiàng),使用此項(xiàng),然后將它保存在Cache對象以備后用。
我們?nèi)绾问褂肅ache對象的鍵值對?
Cache對象使用鍵值對保存和獲取對象。鍵是緩存鍵字符串,用于引用對象。值是被緩存的對象。在最簡單的例子中,將項(xiàng)放到緩存中再獲取它就像是將某項(xiàng)被放到字典中。
要想將項(xiàng)添加到Cache對象: Cache["mykey"] = myValue;
要想從Cache對象中獲取項(xiàng): myValue = Cache["mykey"];
代碼示例如下:
DataTable dt = new DataTable();
…………………………………………
Cache["ObjDataTable"] = dt; 將一個(gè)DataTable緩存到Cache對象中。
DataTable dt = new DataTable();
dt = Cache["ObjDataTable"] as DataTable; 將被保存在緩存中DataTable從緩存中獲取。
ASP.NET Cache 對象設(shè)計(jì)用于保證它并不使用過多的服務(wù)器內(nèi)存。結(jié)果是,當(dāng)用內(nèi)存變得缺乏時(shí),Cache對象自動刪除最少被使用的項(xiàng)。你可以通過定義時(shí)間限制、依賴項(xiàng)、以及項(xiàng)在Cache對象中的優(yōu)先級來影響 Cache對象保存和刪除項(xiàng)的方式。
Cache對象中的項(xiàng)只要是依賴或時(shí)間限制被觸發(fā),就是立即被刪除。試圖獲取被刪除的項(xiàng)將返回null值,除非項(xiàng)再次被添加到 Cache對象中。
絕對期限
你可以使用 AbsoluteEXpiration 參數(shù)為項(xiàng)定義最大的絕對生存期。此參數(shù)是 DateTime 類型的參數(shù),允許你指定項(xiàng)過期的時(shí)間。
我在下面的代碼指定了從創(chuàng)建起5分鐘后,myValue 從 Cache 對象中被刪除:
Cache.Insert("myKey", myValue, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration);
滑動期限
你可以通過使用 SlidingExpiration 參數(shù)為項(xiàng)定義最大的相對生存期。這是一個(gè) TimeSpan 類型參數(shù),允許你指定每個(gè)對象自從最后一次訪問后的時(shí)間間隔以及何時(shí)對象到期。
我在下面的代碼指定了 myValue 最后的訪問的20分鐘后被從 Cache對象中刪除:
Cache.Insert("myKey", myValue, null, null, TimeSpan.FromSeconds(20));
依賴項(xiàng)
有時(shí)你想某對象從 Cache對象中被刪除,因?yàn)橹С值捻?xiàng),如文件已經(jīng)改變。ASP.NET 允許你基于依賴項(xiàng)或另一個(gè)緩存的項(xiàng)來定義緩存項(xiàng)的合法性。基于外部文件和目錄的依賴項(xiàng)被
稱為文件依賴項(xiàng),依賴于另一個(gè)緩存項(xiàng)的依賴項(xiàng)被稱為鍵依賴項(xiàng)。如果依賴項(xiàng)改變,緩存的項(xiàng)被稱為不合法,然后從Cache對象中刪除。
我在下面的代碼指定了當(dāng) myDoc.xml 文件更改時(shí),myValue 從 Cache對象中刪除:
Cache.Insert("myKey", myValue, new CacheDependency(Server.MapPath("myDoc.xml")));
緩存項(xiàng)優(yōu)先級
當(dāng)網(wǎng)絡(luò)服務(wù)器運(yùn)行的內(nèi)存可用量降低時(shí),Cache對象有選擇地刪除項(xiàng)以釋放系統(tǒng)內(nèi)存。你指定高一點(diǎn)優(yōu)先級的項(xiàng)較低可能從緩存中被刪除,而被指定為低一些優(yōu)先級的項(xiàng)被刪除的可能性就要大一些。
我在下列代碼指定了 myValue 有高優(yōu)先級,將成為當(dāng)服務(wù)器內(nèi)存被限制時(shí),最后從 Cache對象刪除的項(xiàng)之一:
Cache.Insert("myKey", myValue, null, null, Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);
設(shè)置 Cache.Insert 中參數(shù)的示例
下列代碼將一個(gè) MyBook 的值使用許多參數(shù)插入到了 Cache對象中。下列首先發(fā)生的依賴項(xiàng)或超 時(shí)事件將使項(xiàng)被從 Cache對象中刪除:
在保存5分鐘后被刪除。
在最后訪問30秒鐘后被刪除。
在 Books.xml 文件更改后刪除。
將項(xiàng)的優(yōu)先級設(shè)置為高,從而如果服務(wù)器資源成為問題時(shí)最后被刪除。
當(dāng)項(xiàng)被從 Cache對象刪除時(shí),回調(diào)函數(shù)onRemove 運(yùn)行。
Cache.Insert("MyBook.CurrentBook", CurrentBook, new CacheDependency(Server.MapPath("")), DateTime.Now.AddMinutes(5), TimeSpan.FromSeconds(30), CacheItemPriority.High, onRemove);
ASP.NET 為您提供了一個(gè)強(qiáng)大的、便于使用的緩存機(jī)制,用于將需要大量服務(wù)器資源來創(chuàng)建的對象存儲在內(nèi)存中。緩存這些類型的資源會大大改進(jìn)應(yīng)用程序的性能。
緩存是由 Cache 類實(shí)現(xiàn)的;緩存實(shí)例是每個(gè)應(yīng)用程序?qū)S玫摹>彺嫔嫫谝蕾囉趹?yīng)用程序的生存期;重新啟動應(yīng)用程序后,將重新創(chuàng)建 Cache 對象。
設(shè)計(jì) Cache 類是為了便于使用。您可以將項(xiàng)放置在 Cache 中,并在以后使用簡單的鍵/值對來檢索這些項(xiàng)。
Cache 類提供了強(qiáng)大的功能,允許您自定義如何緩存項(xiàng)以及將它們緩存多長時(shí)間。例如,當(dāng)缺乏系統(tǒng)內(nèi)存時(shí),緩存會自動移除很少使用的或優(yōu)先級較低的項(xiàng)以釋放內(nèi)存。該技術(shù)也稱為清理,這是緩存確保過期數(shù)據(jù)不使用寶貴的服務(wù)器資源的方式之一。
當(dāng)執(zhí)行清理時(shí),您可以指示 Cache 給予某些項(xiàng)比其他項(xiàng)更高的優(yōu)先級。若要指示項(xiàng)的重要性,可以在使用 Add 或 Insert 方法添加項(xiàng)時(shí)指定一個(gè) CacheItemPriority 枚舉值。
當(dāng)使用 Add 或 Insert 方法將項(xiàng)添加到緩存時(shí),您還可以建立項(xiàng)的過期策略。您可以通過使用 DateTime 值指定項(xiàng)的確切過期時(shí)間(絕對過期時(shí)間),來定義項(xiàng)的生存期。也可以使用 TimeSpan 值指定一個(gè)彈性過期時(shí)間,彈性過期時(shí)間允許您根據(jù)項(xiàng)的上次訪問時(shí)間來指定該項(xiàng)過期之前的運(yùn)行時(shí)間。一旦項(xiàng)過期,便將它從緩存中移除。試圖檢索它的值的行為將返回 null(在 Visual Basic 中為 Nothing),除非該項(xiàng)被重新添加到緩存中。
對于存儲在緩存中的易失項(xiàng)(例如那些定期進(jìn)行數(shù)據(jù)刷新的項(xiàng)或那些只在一段時(shí)間內(nèi)有效的項(xiàng)),通常設(shè)置一種過期策略:只要這些項(xiàng)的數(shù)據(jù)保持為最新的,就將它們保留在緩存中。例如,如果您正在編寫一個(gè)應(yīng)用程序,該應(yīng)用程序通過另一個(gè)網(wǎng)站獲取數(shù)據(jù)來跟蹤體育比賽的比分,那么只要源網(wǎng)站上比賽的比分不更改,就可以緩存這些比分。在此情況下,您可以根據(jù)其他網(wǎng)站更新比分的頻率來設(shè)置過期策略。您可以編寫代碼來確定緩存中是否是最新的比分。如果該比分不是最新的,則代碼可以從源網(wǎng)站讀取比分并緩存新值。
最后,ASP.NET 允許您根據(jù)外部文件、目錄(文件依賴項(xiàng))或另一個(gè)緩存項(xiàng)(鍵依賴項(xiàng))來定義緩存項(xiàng)的有效性。如果具有關(guān)聯(lián)依賴項(xiàng)的項(xiàng)發(fā)生更改,緩存項(xiàng)便會失效并從緩存中移除。您可以使用該技術(shù)在項(xiàng)的數(shù)據(jù)源更改時(shí)從緩存中移除這些項(xiàng)。例如,如果您編寫一個(gè)處理 XML 文件中的財(cái)務(wù)數(shù)據(jù)的應(yīng)用程序,則可以從該文件將數(shù)據(jù)插入緩存中并在此 XML 文件上保留一個(gè)依賴項(xiàng)。當(dāng)該文件更新時(shí),從緩存中移除該項(xiàng),您的應(yīng)用程序重新讀取 XML 文件,然后將刷新后的數(shù)據(jù)放入緩存中。
將項(xiàng)添加到緩存中
可以使用 Cache 對象訪問應(yīng)用程序緩存中的項(xiàng)。可以使用 Cache 對象的 Insert 方法向應(yīng)用程序緩存添加項(xiàng)。該方法向緩存添加項(xiàng),并且通過幾次重載,您可以用不同選項(xiàng)添加項(xiàng),以設(shè)置依賴項(xiàng)、過期和移除通知。如果使用 Insert 方法向緩存添加項(xiàng),并且已經(jīng)存在與現(xiàn)有項(xiàng)同名的項(xiàng),則緩存中的現(xiàn)有項(xiàng)將被替換。
還可以使用 Add 方法向緩存添加項(xiàng)。使用此方法,您可以設(shè)置與 Insert 方法相同的所有選項(xiàng);然而,Add 方法將返回您添加到緩存中的對象。另外,如果使用 Add 方法,并且緩存中已經(jīng)存在與現(xiàn)有項(xiàng)同名的項(xiàng),則該方法不會替換該項(xiàng),并且不會引發(fā)異常。
通過鍵和值直接設(shè)置項(xiàng)向緩存添加項(xiàng)
通過指定項(xiàng)的鍵和值,像將項(xiàng)添加到字典中一樣將其添加到緩存中。
下面的代碼示例將名為 CacheItem1 的項(xiàng)添加到 Cache 對象中:
Cache["CacheItem1"] = "Cached Item 1";
通過使用 Insert 方法將項(xiàng)添加到緩存中
調(diào)用 Insert 方法,傳遞要添加的項(xiàng)的鍵和值。
下面的代碼示例添加名為 CacheItem2 的字符串:
Cache.Insert("CacheItem2", "Cached Item 2");
通過指定依賴項(xiàng)向緩存添加項(xiàng)
調(diào)用 Insert 方法,將 CacheDependency 對象的一個(gè)實(shí)例傳遞給該方法
下面的代碼示例添加名為 CacheItem3 的項(xiàng),該項(xiàng)依賴于緩存中名為 CacheItem2 的另一個(gè)項(xiàng):
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));
下面的代碼示例演示將名為 CacheItem4 的項(xiàng)添加到緩存中,并且在名為 XMLFile.xml 的文件上設(shè)置文件依賴項(xiàng):
Cache.Insert("CacheItem4", "Cached Item 4",
new System.Web.Caching.CacheDependency(
Server.MapPath("XMLFile.xml")));
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載