目的:這篇文章將描述在asp.net中如何管理cache以及cache各個參數的用法.
介紹:
在我解釋cache管理機制時,首先讓我闡明下一個觀念:IE下面的資料管理。每個人都會用不同的方法去解決如何在IE在管理資料。有的會提到用狀態管理,有的提到的cache管理,這裡我比較喜歡cache管理,因為本人比較喜“cache”這個詞。但是狀態管理和cache管理這兩個在概念和意義上是不同的,下面就讓我們來討論下兩都在各個方面的不同之處。
雖然cache管理並不存在於Windows程式,但在web環境中已經得到巨大的應用。自從HTTP變成無協議以來,在WEB上要想分辨兩個不同請求變得非常難,如何分辨如此多的請求變得非常重要,如果是同一請求,我們就可以把資料緩衝起來供web上所有使用者訪問,減少資料重複進行物理載入。
asp.net提供了幾種方法來快取資料在用戶端和伺服器端,但是我們經常為到底用哪種方式而感動苦惱。asp.net提供了以下三種實現方式:
1:Session;2: Application 3: Cache objects,我們必須非常清楚它們之間的優勢,這樣才能充分利用它們的優勢發揮在web程式中.
背景:
這篇文章中,我將簡單涉及cache管理中的不同功能,在web程式中,我們為了避免因高並發產生的資料訪問帶來的效能問題,我們有必要把資料緩衝於伺服器端,使得後來的訪問可以直接調用快取資料,起到資料重用的作用。
緩衝能夠幫忙我們提到服務品質的三個重要方面:
效能:快取資料達到資料重用.避免了重複的物理資料載入.
可量測性:資料緩衝後,減少了從伺服器端載入資料。
實用性:如果其它的系統或者是資料庫發生死機,那麼仍然可以從緩衝中取得資料不受局部硬體的影響。
在一個web 程式中,我們可以資料緩衝,頁面緩衝等等,讓我們來看下資料緩衝在伺服器端和用戶端的不同之處。
1.伺服器端緩衝:
1.1Session狀態管理:
session為每個人快取資料.也就是說這樣緩衝的資料並不能同時供多人共用,限於為單個人快取資料。
狀態管理有三種實現方式,分別是:
1.11:InProc:
它的資料存放區在aspnet_wp.exe 進程中,資料會因為IIS的重啟而丟失。
1.12:StateServer :
較InProc不同的是,它可以儲存於不同的伺服器中.
1.133:SQLServer:
它的資料存放區在資料庫中,資料不會因為IIS的重啟而遺失資料。
後兩種方法與InProc最大的區別在於,我們要確保緩衝的資料是可序列化的,否則只能用於第一種方式.為此我們要仔細分析從而選出最適合自己的方式.
下面是如何作用Session的程式碼片段:
Code
string empNum = Request.QueryString["empnum"];
if (empNum != null)
{
string details = null;
if (Session["EMP_DETAILS"] == null)
{
//Get Employee Details for employee number passed
string details = GetEmployeeDetails(Convert.ToInt32(empNum));
Session["EMP_DETAILS"] = details;
}
else
{
details = Session["EMP_DETAILS"];
}
//send it to the browser
Response.Write(details);
}
1.2 ASP.NET application
asp.net為我們提供了另外一種全域變數儲存方法,Application對象,它也是面向所有使用者,它的生命週期和應用程式一樣,當應用程式初始化後它就開始重建。但它最大的缺點是沒有相關資料到期的方法,此時就要用到cache管理。
1.3 ASP.NET cache
cache是我最喜歡用的機制,這也是為什麼我喜歡說它的原因。它提供了鍵-值對應的方法,cache對應的命名空間是:System.Web.Caching 它的生命週期也依賴於應用程式,但它並不像session,這也是面向所有使用者的。雖然cache看起來特別像application,但它最大的不同是提供了資料緩衝失效控制方法以及資料緩衝依賴管理。也就是說,在cache中我們可以非常容易的按照事先設定好的到期時間來讓cache到期,刪除cache,我們也可以根據緩衝依賴關係來操作cache,當依賴的關係有改動時,此時cache也會自動失效。而這都是applicaion沒法辦到的。
現在讓我們看下asp.net中是如何支援cache的到期以及資料緩衝依賴的。
1.31:緩衝依賴:
顧名思義它是指當事先設定的依賴關係發生變化時,cache 將會失效。在asp.net中提供了兩種依賴關係:
1.311:檔案快取依賴:當磁碟上的一個檔案發生變化時自動讓cache失效
下面是執行個體代碼:
object errorData;
//Load errorData from errors.xml
CacheDependency fileDependency =
new CacheDependency(Server.MapPath("errors.xml"));
Cache.Insert("ERROR_INFO", errorData, fileDependency);
1.312:索引值緩衝依賴:看起來和檔案快取非常像,不同之外就是這種依賴方式不同而已,當有多個cache資訊之間互相關聯時,一個cache資訊的變化將會引起其它cache的失效。例如一個使用者資訊包含:編號,姓名,地址等,如果使用者編號發生變化則cache失效,這種情況下,使用者的基本資料就依賴於使用者編號。
下面是範例程式碼:
string[] relatedKeys = new string[1];
relatedKeys[0] = "EMP_NUM";
CacheDependency keyDependency = new CacheDependency(null, relatedKeys);
Cache["EMP_NUM"] = 5435;
Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);
Cache.Insert("EMP_SAL", "5555USD", keyDependency);
1.32:到期策略:從建立cache開始,一段時間後自動到期。
範例程式碼:
//Absolute Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);
//Sliding Expiration
Cache.Insert("EMP_NAME", "Shubhabrata", null,
Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));
1.4 ASP.NET 網頁輸出快取
有的時候在web網站中,有些頁面在很長一段時間內都不會發生變化,例如一個招聘網站,它對於工資的標題文字一般不會經常更改,一般都是一個月更改一次,所以在這一個月內,使用者看到的內容都是一樣的,所有如果把資料緩衝在伺服器端並不是完美的解決方案。這裡可以用網頁輸出快取。
下面是範例程式碼:
<%@OutputCache Duration="60" VaryByParam="empNum"
Location="Server"%>
2:用戶端緩衝:
在上面的文章中,我討論了些資料緩衝在伺服器端的方法,然而有的時候我們為了提高效能我們要把有些資料緩衝到用戶端。利用這種機制來達到緩解伺服器壓力,不過在用戶端快取資料會有各種不同的安全性問題,下面我說簡要的說下相關內容:
2.1 Cookies:cookies在WEB程式開發中應用的非常廣泛,它可以非常方便的在用戶端與伺服器端相互訪問,不過它有資料大小限制,最大為4K,所有用它經常是儲存小資料。同時cookie對於失效的控制也支援的相當完美。
下面是範例程式碼:
if (this.Request.Cookies["MY_NAME"] == null)
{
this.Response.Cookies.Add(new HttpCookie("MY_NAME",
"Shubhabrata Mohanty"));
}
else
{
this.Response.Write(this.Request.Cookies["MY_NAME"].Value);
}
2.2 ViewState:ViewState是一個全新的概念,它一般用於頁面或者是控制項中保留資料以供和服務端交通。在ASP中的,我們儲存資料是用隱藏控制項來完成(Hidden fields),ViewState也是這樣用的,只不過它比隱藏控制項更加安全性,所有的值都是經過hash處理的。如果你查看頁面原始碼,你都會看到ViewState的存在,一般ViewState不用來儲存大的資料。
下面是範例程式碼:
protected void Page_Load(object sender, EventArgs e)
{
if (this.ViewState["MY_NAME"] == null)
{
this.ViewState["MY_NAME"] = "Shubhabrata Mohanty";
}
//txtName is a TextBox control
this.txtName.Text = this.ViewState["MY_NAME"].ToString();
}
2.3 隱藏控制項 Hidden fields:它是最簡單的,不用多說
下面是範例程式碼:
<!--In ASP.NET-->
<asp:HiddenField ID="myHiddenField" Value="Shubhabrata"
runat="server" />
<!--In HTML-->
<input id="myHiddenField" type="hidden" value="Shubhabrata" />
注:
原文地址:http://www.codeproject.com/KB/web-cache/cachemanagementinaspnet.aspx