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