asp.net 应用数据缓存 -- Cache对象使用
ASP.NET 應(yīng)用數(shù)據(jù)緩存 -- Cache對象使用
[原文:http://msdn.microsoft.com/zh-cn/library/18c1wd61%28v=vs.100%29.aspx]
[說明: 您可以直接使用cache對象,但對MVC中的action,還可以使用OutputCacheAttribute的action filter; 其區(qū)別是OutputCache filter僅對該action有用,要在不同的action甚至controller內(nèi)共享該cache,則只有使用cache對象]
ASP.NET 為您提供了一個強(qiáng)大的、便于使用的緩存機(jī)制,用于將需要大量服務(wù)器資源來創(chuàng)建的對象存儲在內(nèi)存中。緩存這些類型的資源會大大改進(jìn)應(yīng)用程序的性能。
緩存是由 Cache 類實(shí)現(xiàn)的;緩存實(shí)例是每個應(yīng)用程序?qū)S玫摹>彺嫔嫫谝蕾囉趹?yīng)用程序的生存期;重新啟動應(yīng)用程序后,將重新創(chuàng)建 Cache 對象。
設(shè)計 Cache 類是為了便于使用。您可以將項放置在 Cache 中,并在以后使用簡單的鍵/值對來檢索這些項。有關(guān)如何執(zhí)行此操作的示例,請參見如何:將項添加到緩存中和如何:檢索緩存項的值。
Cache 類提供了強(qiáng)大的功能,允許您自定義如何緩存項以及將它們緩存多長時間。例如,當(dāng)缺乏系統(tǒng)內(nèi)存時,緩存會自動移除很少使用的或優(yōu)先級較低的項以釋放內(nèi)存。該技術(shù)也稱為清理,這是緩存確保過期數(shù)據(jù)不使用寶貴的服務(wù)器資源的方式之一。
當(dāng)執(zhí)行清理時,您可以指示 Cache 給予某些項比其他項更高的優(yōu)先級。若要指示項的重要性,可以在使用 Add 或 Insert 方法添加項時指定一個 CacheItemPriority 枚舉值。
當(dāng)使用 Add 或 Insert 方法將項添加到緩存時,您還可以建立項的過期策略。您可以通過使用 DateTime 值指定項的確切過期時間(絕對過期時間),來定義項的生存期。也可以使用 TimeSpan 值指定一個彈性過期時間,彈性過期時間允許您根據(jù)項的上次訪問時間來指定該項過期之前的運(yùn)行時間。一旦項過期,便將它從緩存中移除。試圖檢索它的值的行為將返回 null(在 Visual Basic 中為 Nothing),除非該項被重新添加到緩存中。
對于存儲在緩存中的易失項(例如那些定期進(jìn)行數(shù)據(jù)刷新的項或那些只在一段時間內(nèi)有效的項),通常設(shè)置一種過期策略:只要這些項的數(shù)據(jù)保持為最新的,就將它們保留在緩存中。例如,如果您正在編寫一個應(yīng)用程序,該應(yīng)用程序通過另一個網(wǎng)站獲取數(shù)據(jù)來跟蹤體育比賽的比分,那么只要源網(wǎng)站上比賽的比分不更改,就可以緩存這些比分。在此情況下,您可以根據(jù)其他網(wǎng)站更新比分的頻率來設(shè)置過期策略。您可以編寫代碼來確定緩存中是否是最新的比分。如果該比分不是最新的,則代碼可以從源網(wǎng)站讀取比分并緩存新值。
最后,ASP.NET 允許您根據(jù)外部文件、目錄(文件依賴項)或另一個緩存項(鍵依賴項)來定義緩存項的有效性。如果具有關(guān)聯(lián)依賴項的項發(fā)生更改,緩存項便會失效并從緩存中移除。您可以使用該技術(shù)在項的數(shù)據(jù)源更改時從緩存中移除這些項。例如,如果您編寫一個處理 XML 文件中的財務(wù)數(shù)據(jù)的應(yīng)用程序,則可以從該文件將數(shù)據(jù)插入緩存中并在此 XML 文件上保留一個依賴項。當(dāng)該文件更新時,從緩存中移除該項,您的應(yīng)用程序重新讀取 XML 文件,然后將刷新后的數(shù)據(jù)放入緩存中。
| Cache 對象沒有關(guān)于它所包含項的內(nèi)容的信息。它只保留對這些對象的引用。它還提供跟蹤它們的依賴項和設(shè)置到期策略的方法。 |
有關(guān)如何使用這些功能的更多信息,請參見如何:將項添加到緩存中。
如何:將項添加到緩存中
可以使用 Cache 對象訪問應(yīng)用程序緩存中的項。可以使用 Cache 對象的 Insert 方法向應(yīng)用程序緩存添加項。該方法向緩存添加項,并且通過幾次重載,您可以用不同選項添加項,以設(shè)置依賴項、過期和移除通知。如果使用 Insert 方法向緩存添加項,并且已經(jīng)存在與現(xiàn)有項同名的項,則緩存中的現(xiàn)有項將被替換。
還可以使用 Add 方法向緩存添加項。使用此方法,您可以設(shè)置與 Insert 方法相同的所有選項;然而,Add 方法將返回您添加到緩存中的對象。另外,如果使用 Add 方法,并且緩存中已經(jīng)存在與現(xiàn)有項同名的項,則該方法不會替換該項,并且不會引發(fā)異常。
本主題中的過程闡釋了向應(yīng)用程序緩存添加項的如下方式:
-
通過鍵和值直接設(shè)置項,向緩存添加項。
-
使用 Insert 方法向緩存添加項。
-
向緩存添加項并添加依賴項,以便當(dāng)該依賴項更改時,將該項從緩存中移除。可以基于其他緩存項、文件和多個對象設(shè)置依賴項。
-
將設(shè)有過期策略的項添加到緩存中。除了能設(shè)置項的依賴項以外,還可以設(shè)置項在一段時間以后(彈性過期)或在指定時間(絕對過期)過期。您可以定義絕對過期時間或彈性過期時間,但不能同時定義兩者。
-
向緩存添加項,并定義緩存的項的相對優(yōu)先級。相對優(yōu)先級幫助 .NET Framework 確定要移除的緩存項;較低優(yōu)先級的項比較高優(yōu)先級的項先從緩存中移除。
-
通過調(diào)用 Add 方法添加項。
除了這里顯示的依賴項,可以在 SQL?Server 表上或基于自定義依賴項創(chuàng)建依賴項。有關(guān)更多信息,請參見 ASP.NET 緩存概述和使用 SqlCacheDependency 類在 ASP.NET 中緩存。
當(dāng)從緩存中移除項時,還可以使用 CacheItemRemovedCallback 委托讓應(yīng)用程序緩存通知應(yīng)用程序。有關(guān)完整示例,請參見如何:從緩存中移除項時通知應(yīng)用程序。
通過鍵和值直接設(shè)置項向緩存添加項
-
通過指定項的鍵和值,像將項添加到字典中一樣將其添加到緩存中。
下面的代碼示例將名為 CacheItem1 的項添加到 Cache 對象中:
C# Cache["CacheItem1"] = "Cached Item 1";
通過使用 Insert 方法將項添加到緩存中
-
調(diào)用 Insert 方法,傳遞要添加的項的鍵和值。
下面的代碼示例添加名為 CacheItem2 的字符串:
C# Cache.Insert("CacheItem2", "Cached Item 2");
通過指定依賴項向緩存添加項
-
調(diào)用 Insert 方法,將 CacheDependency 對象的一個實(shí)例傳遞給該方法
下面的代碼示例添加名為 CacheItem3 的項,該項依賴于緩存中名為 CacheItem2 的另一個項:
C# string[] dependencies = { "CacheItem2" }; Cache.Insert("CacheItem3", "Cached Item 3",new System.Web.Caching.CacheDependency(null, dependencies));
下面的代碼示例演示將名為 CacheItem4 的項添加到緩存中,并且在名為 XMLFile.xml 的文件上設(shè)置文件依賴項:
C# Cache.Insert("CacheItem4", "Cached Item 4",new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
下面的代碼示例演示如何創(chuàng)建多個依賴項。它向緩存中名為 CacheItem1 的另一個項添加鍵依賴項,向名為 XMLFile.xml 的文件添加文件依賴項。
C# System.Web.Caching.CacheDependency dep1 = new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")); string[] keyDependencies2 = { "CacheItem1" }; System.Web.Caching.CacheDependency dep2 = new System.Web.Caching.CacheDependency(null, keyDependencies2); System.Web.Caching.AggregateCacheDependency aggDep = new System.Web.Caching.AggregateCacheDependency(); aggDep.Add(dep1); aggDep.Add(dep2); Cache.Insert("CacheItem5", "Cached Item 5", aggDep);
將設(shè)有過期策略的項添加到緩存中
-
調(diào)用 Insert 方法,將絕對過期時間或彈性過期時間傳遞給該方法。
下面的代碼示例將有一分鐘絕對過期時間的項添加到緩存中:
C# Cache.Insert("CacheItem6", "Cached Item 6",null, DateTime.Now.AddMinutes(1d), System.Web.Caching.Cache.NoSlidingExpiration);下面的代碼示例將有 10 分鐘彈性過期時間的項添加到緩存中:
C# Cache.Insert("CacheItem7", "Cached Item 7",null, System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0, 10, 0));
將設(shè)有優(yōu)先級設(shè)置的項添加到緩存中
-
調(diào)用 Insert 方法,從 CacheItemPriority 枚舉中指定一個值。
下面的代碼示例將優(yōu)先級值為 High 的項添加到緩存中:
C# Cache.Insert("CacheItem8", "Cached Item 8",null, System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.High, null);
使用 Add 方法向緩存添加項
-
調(diào)用 Add 方法,它返回一個表示項的對象。
下面的代碼示例向緩存添加名為 CacheItem9 的項,同時將變量 CachedItem9 的值設(shè)置為已添加的項。
C# string CachedItem9 = (string)Cache.Add("CacheItem9","Cached Item 9", null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default,null);
如何:檢索緩存項的值
要從緩存中檢索數(shù)據(jù),應(yīng)指定存儲緩存項的鍵。不過,由于緩存中所存儲的信息為易失信息,即該信息可能由 ASP.NET 移除,因此建議的開發(fā)模式是首先確定該項是否在緩存中。如果不在,則應(yīng)將它重新添加到緩存中,然后檢索該項。
檢索緩存項的值
-
通過在 Cache 對象中進(jìn)行檢查來確定該項是否不為 null(在 Visual Basic 中為 Nothing)。如果該項存在,則將它分配給變量。否則,重新創(chuàng)建該項,將它添加到緩存中,然后訪問它。
下面的代碼示例演示如何從緩存中檢索名為 CacheItem 的項。代碼將該項的內(nèi)容分配給名為 cachedString 的變量。如果該項不在緩存中,則代碼會將它添加到緩存中,然后將它分配給 cachedString。
C# string cachedString; cachedString = (string)Cache["CacheItem"]; if (cachedString == null) {cachedString = "Hello, World.";Cache.Insert("CacheItem", cachedString); }
如何:從 ASP.NET 緩存中刪除項
ASP.NET 緩存中的數(shù)據(jù)是易失的,即不能永久保存。由于以下任一原因,緩存中的數(shù)據(jù)可能會自動移除:
-
緩存已滿。
-
該項已過期。
-
依賴項發(fā)生更改。
有關(guān)更多信息,請參見 ASP.NET 緩存概述。
從緩存中移除項的具體方法由用于向緩存添加項的代碼確定。有關(guān)更多信息,請參見如何:將項添加到緩存中。項從緩存中移除時會向您發(fā)出通知。有關(guān)更多信息,請參見如何:從緩存中移除項時通知應(yīng)用程序。
除了允許從緩存中自動移除項之外,還可以顯式移除項。
| 如果調(diào)用 Insert 方法,并向緩存中添加與現(xiàn)有項同名的項,則將從緩存中刪除該舊項。 |
從緩存中顯式刪除項
-
調(diào)用 Remove 方法,以傳遞要移除的項的鍵。
下面的示例演示如何移除鍵為 MyData1 的項。
C# Cache.Remove("MyData1");
如何:從緩存中移除項時通知應(yīng)用程序
在大多數(shù)緩存方案中,當(dāng)從緩存中移除項后,直到再次需要此項時,才需要將其放回緩存中。典型的開發(fā)模式是在使用項之前始終檢查該項是否已在緩存中。如果項位于緩存中,則可以使用。如果不在緩存中,則應(yīng)再次檢索該項,然后將其添加回緩存。
但是,在某些情況下,如果從緩存中移除項時通知應(yīng)用程序,可能非常有用。例如,您可能具有一個緩存的報告,創(chuàng)建該報告需花費(fèi)大量的時間進(jìn)行處理。當(dāng)該報告從緩存中移除時,您希望重新生成該報告,并立即將其置于緩存中,以便下次請求該報告時,用戶不必等待對此報告進(jìn)行處理。
為了在從緩存中移除項時能夠發(fā)出通知,ASP.NET 提供了 CacheItemRemovedCallback 委托。該委托定義編寫事件處理程序時使用的簽名,當(dāng)對從緩存中移除項進(jìn)行響應(yīng)時會調(diào)用此事件處理程序。ASP.NET 還提供 CacheItemRemovedReason 枚舉,用于指定移除緩存項的原因。
通常,通過在管理嘗試檢索的特定緩存數(shù)據(jù)的業(yè)務(wù)對象中創(chuàng)建處理程序,來實(shí)現(xiàn)回調(diào)。例如,您可能有一個 ReportManager 對象,該對象具有兩種方法,即 GetReport 和 CacheReport。GetReport 報告方法檢查緩存以查看報告是否已緩存;如果沒有,該方法將重新生成報告并將其緩存。CacheReport 方法具有與 CacheItemRemovedCallback 委托相同的函數(shù)簽名;從緩存中移除報告時,ASP.NET 會調(diào)用 CacheReport 方法,然后將報告重新添加到緩存中。
當(dāng)從緩存中移除項時通知應(yīng)用程序
創(chuàng)建一個類,負(fù)責(zé)從緩存中檢索項并處理回調(diào)方法,以將項添加回緩存中。
在該類中,創(chuàng)建用于將項添加到緩存中的方法。
在該類中,創(chuàng)建用于從緩存中獲取項的方法。
創(chuàng)建用于處理緩存項移除回調(diào)的方法。該方法必須具備與 CacheItemRemovedCallback 委托相同的函數(shù)簽名。從緩存中刪除項時,會在該方法中執(zhí)行要運(yùn)行的邏輯,如重新生成項并將其添加回緩存中。
測試緩存項回調(diào)
創(chuàng)建一個 ASP.NET 網(wǎng)頁,該網(wǎng)頁將調(diào)用類中用于將項添加到緩存中的方法。
下面的代碼示例演示如何調(diào)用 ReportManager 類的 GetReport 方法(在此過程后面的示例中定義)。然后將在使用頁面的 Page_Load 方法期間顯示 Label 控件 Label1 中的報告。
C# protected void Page_Load(object sender, EventArgs e) {this.Label1.Text = ReportManager.GetReport(); }在瀏覽器中請求 ASP.NET 頁并查看報告。
報告是在首次請求頁時創(chuàng)建的,在緩存中的報告被移除之前,后續(xù)請求都將訪問緩存中的報告。
示例
下面的代碼示例演示一個名為 ReportManager 的、用于在從緩存中刪除項時處理通知的完整類。該類管理字符串形式的報告,此報告表示一個長期運(yùn)行的進(jìn)程。
盡管該示例使用聲明為 static(在 Visual Basic 中為 Shared)的類,但并不是必須使用靜態(tài)類。不過,刪除緩存項時,用于處理回調(diào)的方法必須存在。例如,不應(yīng)在 ASP.NET 頁中實(shí)現(xiàn)回調(diào)處理程序,因為在從緩存中刪除項之前該頁可能已被釋放,因此用于處理回調(diào)的方法將不可用。為了確保從緩存中刪除項時處理回調(diào)的方法仍然存在,請使用該方法的靜態(tài)類。但是,靜態(tài)類的缺點(diǎn)是需要保證所有靜態(tài)方法都是線程安全的。
| 請不要在頁面中將 CacheItemRemovedCallback 設(shè)置為一個方法。除了在釋放頁面后回調(diào)無法使用頁面方法以外,將回調(diào)指向頁面方法還會阻礙垃圾回收將頁面使用的內(nèi)存回收。由于回調(diào)包含對頁面的引用,而垃圾回收器不會從內(nèi)存中移除包含任何引用的項,因此會出現(xiàn)這種情況。在加載應(yīng)用程序期間,這可能會導(dǎo)致內(nèi)存很快被用光。 |
該示例類包括以下功能:
-
私有成員,用于跟蹤報告是否已從緩存中移除。
-
名為 CacheReport 的方法,用于將項以 MyReport 的名稱添加到緩存中,并將該項設(shè)置為在添加到緩存中后一分鐘過期。該方法還會將 ReportRemovedCallback 方法傳遞給 onRemoveCallback 參數(shù),從而注冊 ReportRemoveCallback 方法,以便在從緩存中刪除項時進(jìn)行調(diào)用。
-
名為 GetReport 的方法,用于從緩存中獲取項。該方法確定名為 MyReport 的項是否存在于緩存中。如果該項不存在,則該方法將調(diào)用 CacheReport,,將該項添加到緩存中。
-
名為 ReportRemovedCallback 的方法,用于處理緩存項移除回調(diào)。ReportRemovedCallback 具有與 CacheItemRemovedCallback 委托相同的函數(shù)簽名。該方法將變量 _reportRemovedFromCache 設(shè)置為 true,然后通過 CacheReport 方法將項添加回緩存中。
總結(jié)
以上是生活随笔為你收集整理的asp.net 应用数据缓存 -- Cache对象使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果公布自混传感器头戴设备专利 头显今年
- 下一篇: asp.net MVC中的tip