介紹:
在我解釋cache管理機制時首先讓我闡明下一個觀念IE下面的數據管理每個人都會用不同的方法去解決如何在IE在管理數據有的會提到用狀態管理有的提到的cache管理這裡我比較喜歡cache管理因為本人比較喜cache這個詞但是狀態管理和cache管理這兩個在概念和意義上是不同的下面就讓我們來討論下兩都在各個方面的不同之處
雖然cache管理並不存在於Windows程序但在web環境中已經得到巨大的應用自從HTTP變成無協議以來在WEB上要想分辨兩個不同請求變得非常難如何分辨如此多的請求變得非常重要如果是同一請求我們就可以把數據緩存起來供web上所有用戶訪問減少數據重復進行物理加載
提供了幾種方法來緩存數據在客戶端和服務器端但是我們經常為到底用哪種方式而感動苦惱提供了以下三種實現方式
:Session;: Application : Cache objects我們必須非常清楚它們之間的優勢這樣才能充分利用它們的優勢發揮在web程序中
背景
這篇文章中我將簡單涉及cache管理中的不同功能在web程序中我們為了避免因高並發產生的數據訪問帶來的性能問題我們有必要把數據緩存於服務器端使得後來的訪問可以直接調用緩存數據起到數據重用的作用
緩存能夠幫忙我們提到服務質量的三個重要方面
性能緩存數據達到數據重用避免了重復的物理數據加載
可量測性數據緩存後減少了從服務器端加載數據
實用性如果其它的系統或者是數據庫發生死機那麼仍然可以從緩存中取得數據不受局部硬件的影響
在一個web 程序中我們可以數據緩存頁面緩存等等讓我們來看下數據緩存在服務器端和客戶端的不同之處
服務器端緩存:
Session狀態管理:
session為每個人緩存數據也就是說這樣緩存的數據並不能同時供多人共享限於為單個人緩存數據
狀態管理有三種實現方式分別是
:InProc:
它的數據存儲在aspnet_wpexe 進程中數據會因為IIS的重啟而丟失
:StateServer :
較InProc不同的是它可以存儲於不同的服務器中
:SQLServer:
它的數據存儲在數據庫中數據不會因為IIS的重啟而丟失數據
後兩種方法與InProc最大的區別在於我們要確保緩存的數據是可序列化的否則只能用於第一種方式為此我們要仔細分析從而選出最適合自己的方式
下面是如何作用Session的代碼片段
Code
string empNum = RequestQueryString[empnum];
if (empNum != null)
{
string details = null;
if (Session[EMP_DETAILS] == null)
{
//Get Employee Details for employee number passed
string details = GetEmployeeDetails(ConvertToInt(empNum));
Session[EMP_DETAILS] = details;
}
else
{
details = Session[EMP_DETAILS];
}
//send it to the browser
ResponseWrite(details);
}
ASPNET application
為我們提供了另外一種全局變量保存方法Application對象它也是面向所有用戶它的生命周期和應用程序一樣當應用程序初始化後它就開始重建但它最大的缺點是沒有相關數據過期的方法此時就要用到cache管理
ASPNET cache
cache是我最喜歡用的機制這也是為什麼我喜歡說它的原因它提供了鍵值對應的方法cache對應的命名空間是SystemWebCaching 它的生命周期也依賴於應用程序但它並不像session這也是面向所有用戶的雖然cache看起來特別像application但它最大的不同是提供了數據緩存失效控制方法以及數據緩存依賴管理也就是說在cache中我們可以非常容易的按照事先設定好的過期時間來讓cache過期刪除cache我們也可以根據緩存依賴關系來操作cache當依賴的關系有改動時此時cache也會自動失效而這都是applicaion沒法辦到的
現在讓我們看下中是如何支持cache的過期以及數據緩存依賴的
:緩存依賴
顧名思義它是指當事先設定的依賴關系發生變化時cache 將會失效在中提供了兩種依賴關系
文件緩存依賴:當磁盤上的一個文件發生變化時自動讓cache失效
下面是實例代碼
object errorData;
//Load errorData from errorsxml
CacheDependency fileDependency =
new CacheDependency(ServerMapPath(errorsxml));
CacheInsert(ERROR_INFO errorData fileDependency);
鍵值緩存依賴看起來和文件緩存非常像不同之外就是這種依賴方式不同而已當有多個cache信息之間互相關聯時一個cache信息的變化將會引起其它cache的失效例如一個用戶信息包含編號姓名地址等如果用戶編號發生變化則cache失效這種情況下用戶的基本信息就依賴於用戶編號
下面是示例代碼
string[] relatedKeys = new string[];
relatedKeys[] = EMP_NUM;
CacheDependency keyDependency = new CacheDependency(null relatedKeys);
Cache[EMP_NUM] = ;
CacheInsert(EMP_NAME Shubhabrata keyDependency);
CacheInsert(EMP_ADDR Bhubaneswar keyDependency);
CacheInsert(EMP_SAL USD keyDependency);
:過期策略從創建cache開始一段時間後自動過期
示例代碼
//Absolute Expiration
CacheInsert(EMP_NAME Shubhabrata null
DateTimeNowAddDays() CacheNoSlidingExpiration);
//Sliding Expiration
CacheInsert(EMP_NAME Shubhabrata null
CacheNoAbsoluteExpiration TimeSpanFromSeconds());
ASPNET 頁面輸出緩存
有的時候在web站點中有些頁面在很長一段時間內都不會發生變化例如一個招聘網站它對於工資的描述文字一般不會經常更改一般都是一個月更改一次所以在這一個月內用戶看到的內容都是一樣的所有如果把數據緩存在服務器端並不是完美的解決方案這裡可以用頁面輸出緩存
下面是示例代碼
<%@OutputCache Duration= VaryByParam=empNum
Location=Server%>
:客戶端緩存
在上面的文章中我討論了些數據緩存在服務器端的方法然而有的時候我們為了提高性能我們要把有些數據緩存到客戶端利用這種機制來達到緩解服務器壓力不過在客戶端緩存數據會有各種不同的安全性問題下面我說簡要的說下相關內容
Cookies:cookies在WEB程序開發中應用的非常廣泛它可以非常方便的在客戶端與服務器端相互訪問不過它有數據大小限制最大為K所有用它經常是保存小數據同時cookie對於失效的控制也支持的相當完美
下面是示例代碼
if (thisRequestCookies[MY_NAME] == null)
{
thisResponseCookiesAdd(new HttpCookie(MY_NAME
Shubhabrata Mohanty));
}
else
{
thisResponseWrite(thisRequestCookies[MY_NAME]Value);
}
ViewState:ViewState是一個全新的概念它一般用於頁面或者是控件中保留數據以供和服務端交通在ASP中的我們存儲數據是用隱藏控件來完成(Hidden fields)ViewState也是這樣用的只不過它比隱藏控件更加安全性所有的值都是經過hash處理的如果你查看頁面源代碼你都會看到ViewState的存在一般ViewState不用來保存大的數據
下面是示例代碼
protected void Page_Load(object sender EventArgs e)
{
if (thisViewState[MY_NAME] == null)
{
thisViewState[MY_NAME] = Shubhabrata Mohanty;
}
//txtName is a TextBox control
thistxtNameText = thisViewState[MY_NAME]ToString();
}
隱藏控件 Hidden fields:它是最簡單的不用多說
下面是示例代碼
<!In ASPNET>
<asp:HiddenField ID=myHiddenField Value=Shubhabrata
runat=server />
<!In HTML>
<input id=myHiddenField type=hidden value=Shubhabrata />
From:http://tw.wingwit.com/Article/program/net/201311/12415.html