cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...
???? 目的:這篇文章將描述在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程序中.???? 背景:
?????????
???????? 緩存能夠幫忙我們提到服務質量的三個重要方面:
?????????? 性能:緩存數據達到數據重用.避免了重復的物理數據加載.?????????? 可量測性:數據緩存后,減少了從服務器端加載數據。
?????????? 實用性:如果其它的系統或者是數據庫發生死機,那么仍然可以從緩存中取得數據不受局部硬件的影響。
?
???? 在一個web 程序中,我們可以數據緩存,頁面緩存等等,讓我們來看下數據緩存在服務器端和客戶端的不同之處。
?
???? 1.服務器端緩存:
???? ?? 1.1Session狀態管理:
????????? 狀態管理有三種實現方式,分別是:
?????????? 1.11:InProc:
???????????????? 它的數據存儲在aspnet_wp.exe 進程中,數據會因為IIS的重啟而丟失。
?????????? 1.12:StateServer :
???????????????? 較InProc不同的是,它可以存儲于不同的服務器中.
?????????? 1.133:SQLServer:
??????????????? 它的數據存儲在數據庫中,數據不會因為IIS的重啟而丟失數據。
?
?????????? 后兩種方法與InProc最大的區別在于,我們要確保緩存的數據是可序列化的,否則只能用于第一種方式.為此我們要仔細分析從而選出最適合自己的方式.
?
????????? 下面是如何作用Session的代碼片段:
?
Codestring?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
轉載于:https://www.cnblogs.com/lihuimingcn/archive/2008/11/14/1333376.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用putty中的pscp命令拷贝文件
- 下一篇: 逻辑推导题