asp.net缓存机制
一、緩存的類別
1、頁面輸出ASP.NET數據緩存
頁面輸出緩存是一種傳統級別的相對簡單的緩存機制。它將頁面數據緩存在服務器內存中,當有客戶端再次請求這些內容的時候,服務器可以直接將這些頁面數據輸出,直到數據緩存過期。
頁面輸出緩存有兩種使用方法:
使用@ OutputCache指令,常見代碼如:
〈%@ OutputCache Duration="60" VaryByParam="sID" Location="Any"%〉
以上例子定義了頁面輸出緩存有效時間為60s,60s后新建緩存;緩存版本因頁面傳遞的sID參數不同而不同;Location="Any"指定了。
使用頁面輸出緩存API該方法在頁面的程序部分執行,常見代碼如:
Response.Cache.SetExpires(DataTime.Now.AddSeconds(60));
上句設定頁面緩存有效時間為60s。
2、頁面部分緩存
有時候我們可能并不希望把整個頁面都緩存起來,而只是緩存頁面的某個部分。常用方法有3種:
使用@ OutputCache指令
這種方法的實質是:將需要緩存的這部分內容做成用戶自定義控件,然后為自定義控件設置頁面緩存代碼,方法同頁面輸出緩存。
3、應用程序數據緩存
ASP.NET數據緩存的主要功能是在內存中存儲各種與應用程序相關的對象。方法有三種:?
指定鍵和值
Cache["keyName"] = "123";
該語句將新建或者重寫名稱為txtName的緩存,并賦值為123。
使用Add方法
Cache.Add("keyName","123",null,DataTime.Now.AddSeconds(60),TimeSpan.Zero, CacheItemPriority.High,onRemove);
該句實現上例同樣的功能,并設定其緩存依賴項為null;緩存有效時間為60s;最后一次訪問所添加對象時到該對象過期時間的時間間隔為零(TimeSpan.Zero);緩存對象優先級為High;當緩存被刪除時調用委托名稱為onRemove。
使用Insert方法
Insert方法和Add方法使用方法基本一致,但Insert方法還有幾種自己的重載后的方法,例如:
Cache.Insert("keyName","123");
4、緩存依賴
ASP.NET數據緩存的好處很多,但他也有弊端。比如說數據的實時性,用戶獲取的頁面可能是幾十秒甚至是幾個小時以前的服務器緩存信息,這一點對于實時性要求比較高的程序來說是不可容忍的。這時候我們可以通過設定緩存依賴,通過對依賴文件的更改變動情況的判斷,來決定程序是否需要重建(刷新)緩存。
緩存依賴的方式有很多種,這里我們著重講解自定義依賴緩存: 自定義緩存依賴
代碼:
string fileName = Server.MapPath
("file.xml");//設置文件路徑
DateTime dt = DateTime.Now;
//設置跟蹤依賴文件的開始時間
CacheDependency dep = new CacheDependency
(fileName,dt);//創建依賴對象
?
?
二、緩存使用舉例
?
ASP.NET緩存數據技巧三則
?
?
運行后分別點擊16和19會根據這兩個關鍵字SELECT出不同的數據,這時候根據我們傳遞的兩個參數會分別建立兩個緩存頁,在每點擊一個關鍵字后請記住顯示的時間,再反復刷新看看時間有什么變化!好了接下來講一下數據緩存。 ASP.NET數據緩存(Data Caching) 在System.Web.Caching空間里有一個類“Cache”我們可以通過這個類對數據進行緩存。 最簡單的緩存方法:Cache["MyCacheString"] = "My CSDN BLOG!!!"; 通過賦值的形式建立一個緩存,再通過賦值的形式取出緩存:myLabel.Text = Cache["MyCacheString"].ToString();這種方法使用非常的簡單可是功能上受到了一些限制,為了更完善的訂制緩存,應該使用Cache.Insert()方法,下面舉個例子: 頁面里只需要放一下GridView就可以了?
?
ASP.NET數據緩存參數說明 Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan) 1是緩存的名稱,2是緩存的數據對象,3是緩存鍵依賴項,通常為Null,4是過期時間,如果使用相對過期時間則設為NoAbsoluteExpiration,5是可調過期時間,如果參數4使用了固定過期時間,則此參數要設成NoSlidingExpiration。呵呵是不是看的有點暈啊,舉兩個具體例子說一下過期時間的問題 Cache.Insert("ds", dv, null,DateTime.Now.AddMinutes(5) , System.Web.Caching.Cache.NoSlidingExpiration);在這個例子里當緩存建立后過5分鐘就過期。
Cache.Insert("ds", dv, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5)); 這個例子里緩存建立后,過期時間為可調,比如1:20秒建立的緩存過期時間應該是6:20但如果在3:20有人訪問了緩存,則過期時間將調整為8:20,以此類推…… 我們在VS2005里建立一個測試看看使用緩存前和使用緩存后的性能變化吧!看到沒有,沒有緩存前用了0.43秒而使用緩存后只用了0.08秒性能相差5倍多啊!!! 三、ASP.NET緩存數據技巧三則 ASP.NET緩存數據技巧:訪問緩存的值 由于緩存中所存儲的信息為易失信息,即該信息可能由 ASP.NET 移除,因此建議先確定該項是否在緩存中。如果不在,則應將它重新添加到緩存中,然后檢索該項。 string?cachedString; if?(Cache["CacheItem"] !=?null) { cachedString = (string)Cache["CacheItem"]; } else { //緩存不存在時 Cache.Insert("CacheItem", "Hello, World.") cachedString = (string)Cache["CacheItem"]; } ASP.NET緩存數據技巧:刪除緩存項 由于以下任一原因,緩存中的數據可能會自動移除:緩存已滿、該項已過期、依賴項發生更改。注意:如果調用 Insert 方法,并向緩存中添加與現有項同名的項,則將從緩存中刪除該舊項。顯示刪除緩存的值: Cache.Remove("MyCacheKey"); ASP.NET緩存數據技巧:刪除緩存項時通知應用程序 從緩存中移除項時通知應用程序,可能非常有用。例如,可能具有一個緩存的報告,創建該報告需花費大量的時間進行處理。當該報告從緩存中移除時,希望重新生成該報告,并立即將其置于緩存中,以便下次請求該報告時,用戶不必等待對此報告進行處理。 ASP.NET 提供了CacheItemRemovedCallback 委托,在從緩存中移除項時能夠發出通知。還提供 CacheItemRemovedReason 枚舉,用于指定移除緩存項的原因。舉例:假設有一個 ReportManager 對象,該對象具有兩種方法,即 GetReport 和 CacheReport。GetReport 報告方法檢查緩存以查看報告是否已緩存;如果沒有,該方法將重新生成報告并將其緩存。CacheReport 方法具有與 CacheItemRemovedCallback 委托相同的函數簽名;從緩存中移除報告時,ASP.NET 會調用 CacheReport 方法,然后將報告重新添加到緩存中。 創建一個 ASP.NET 網頁,該網頁將調用類中用于將項添加到緩存中的方法。 protected?void?Page_Load(object?sender, EventArgs e) { this.Label1.Text = ReportManager.GetReport(); } 創建用于在從緩存中刪除項時處理通知的完整類ReportManager。 using?System; using?System.Web; using?System.Web.Caching; public?static?class?ReportManager { private?static?bool?_reportRemovedFromCache =?false; static?ReportManager() { } //從緩存中獲取項 public?static?String GetReport() { lock?(typeof(ReportManager)) { if?(HttpContext.Current.Cache["MyReport"] !=?null) { //存在MyReport緩存項,返回緩存值 return?(string)HttpRuntime.Cache["MyReport"]; } else { //MyReport緩存項不存在,則創建MyReport緩存項 CacheReport(); return?(string)HttpRuntime.Cache["MyReport"]; } } } //將項以 MyReport 的名稱添加到緩存中,并將該項設置為在添加到緩存中后一分鐘過期。 //并且該方法注冊 ReportRemoveCallback 方法,以便在從緩存中刪除項時進行調用。 public?static?void?CacheReport() { lock?(typeof(ReportManager)) { HttpContext.Current.Cache.Add("MyReport", CreateReport(),?null, DateTime.MaxValue,?new?TimeSpan(0, 1, 0), System.Web.Caching.CacheItemPriority.Default, ReportRemovedCallback); } } //創建報告,該報告時MyReport緩存項的值 private?static?string?CreateReport() { System.Text.StringBuilder myReport =?new?System.Text.StringBuilder(); myReport.Append("Sales Report< br />"); myReport.Append("2005 Q2 Figures< br />"); myReport.Append("Sales NE Region - $2 million< br />"); myReport.Append("Sales NW Region - $4.5 million< br />"); myReport.Append("Report Generated: " + DateTime.Now.ToString() + "< br />"); myReport.Append("Report Removed From Cache: " + _reportRemovedFromCache.ToString()); return?myReport.ToString(); } //當從緩存中刪除項時調用該方法。 public?static?void?ReportRemovedCallback(String key,?object?value, CacheItemRemovedReason removedReason) { _reportRemovedFromCache =?true; CacheReport(); } } 不應在 ASP.NET 頁中實現回調處理程序,因為在從緩存中刪除項之前該頁可能已被釋放,因此用于處理回調的方法將不可用,應該在非ASP.NET的程序集中實現回調處理程序。為了確保從緩存中刪除項時處理回調的方法仍然存在,請使用該方法的靜態類。但是,靜態類的缺點是需要保證所有靜態方法都是線程安全的,所以使用lock關鍵字。
本文轉自linzheng 51CTO博客,原文鏈接:http://blog.51cto.com/linzheng/1081796
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的asp.net缓存机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bash scripts
- 下一篇: [转] WinForm实现移除控件某个事