asp.net中緩存的使用介紹一


介紹:

          在我解釋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.1、Session狀態管理:

          session為每個人緩存數據,面向單個用戶 即:自己.也就是說這樣緩存的數據並不能同時供多人共享限於為單個人緩存數據

          狀態管理有三種實現方式,分別是:

           1.11:InProc:

                 它的數據存儲在aspnet_wp.exe 進程中,數據會因為IIS的重啟而丟失。

           1.12:StateServer :

                 較InProc不同的是,它可以存儲於不同的服務器中.

           1.133:SQLServer:

                它的數據存儲在數據庫中,數據不會因為IIS的重啟而丟失數據。

            后兩種方法與InProc最大的區別在於,我們要確保緩存的數據是可序列化的,否則只能用於第一種方式.為此我們要仔細分析從而選出最適合自己的方式.

 

          下面是如何作用Session的代碼片段:

 

復制代碼
string empNum = Request.QueryString["empnum"];
if (empNum != null)
{
    string details = null;
    if (Session["EMP_DETAILS"] == null)
    {
        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對象,它也是面向所有用戶,它的生命周期也依賴於應用程序,當應用程序初始化后它就開始重建。但它最大的缺點是:application不可以指定過期時間,只能通過人工使用Remove或RemoveAll或RemoveAt方法或者關閉應用程序 移除,達到過期目的,這樣不太智能,,此時就要用到cache管理。

       1.3 ASP.NET cache

     cache 面向所有用戶,和Application的區別:cache可以根據設定時間 來達到過期的目的,而不是Remove來移除緩存
        cache是我最喜歡用的機制,這也是為什么我喜歡說它的原因。它提供了鍵-值對應的方法,

     cache對應的命名空間是:System.Web.Caching 它的生命周期也依賴於應用程序,當應用程序初始化后它就開始重建,但它並不像session,這也是面向所有用戶的。

     雖然cache看起來特別像application,但它最大的不同是提供了數據緩存失效控制方法(cache可以指定過期時間)以及數據緩存依賴管理。也就是說,在cache中我們可以非常容易的按照事先設定好的過期時間來讓cache過期,刪除cache,我們也可以根據緩存依賴關系來操作cache,當依賴的關系有改動時,此時cache也會自動失效。而這都是applicaion沒法辦到的。

     現在讓我們看下asp.net中是如何支持cache的過期以及數據緩存依賴的。

 

           1.31:緩存依賴:

                顧名思義它是指當事先設定的依賴關系發生變化時,cache 將會失效。在asp.net中提供了兩種依賴關系:
                     1.311:文件緩存依賴:當磁盤上的一個文件發生變化時自動讓cache失效
                       下面是實例代碼:

   string 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失效,這種情況下,用戶的基本信息就依賴於用戶編號。
                       下面是示例代碼:

 

 

復制代碼
 1             if (Cache["EMP_NUM"] == null || Cache["EMP_NAME"] == null || Cache["EMP_ADDR"] == null || Cache["EMP_SAL"] == null)
 2             {
 3                 #region 報錯:試圖從多個緩存條目中引用 CacheDependency 對象
 4                 //CacheDependency keyDependency = new CacheDependency(null, new string[] { "EMP_NUM" });
 5                 //Cache.Insert("EMP_NUM", "5435");
 6 
 7                 //Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency);
 8                 //報錯:試圖從多個緩存條目中引用 CacheDependency 對象
 9                 //Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency);
10                 #endregion
11 
12                 #region 解決辦法:只要確保每個CacheDependency 只與一個緩存項關聯即可。
13                 //只要  EMP_NUM 緩存 數據改變時 則 EMP_NAME  EMP_ADDR 自動清空,EMP_NUM 不被清空
14                 //EMP_NAME  EMP_ADDR 就依賴於EMP_NUM
15                 CacheDependency keyDependency1 = new CacheDependency(null, new string[] { "EMP_NUM" });
16                 CacheDependency keyDependency2 = new CacheDependency(null, new string[] { "EMP_NUM" });
17                 if (Cache["EMP_NUM"] == null)
18                 {
19                     Cache.Insert("EMP_NUM", "5435");
20                 }
21                 Cache.Insert("EMP_NAME", "Shubhabrata", keyDependency1);
22                 Cache.Insert("EMP_ADDR", "Bhubaneswar", keyDependency2);
23                 #endregion
24             }
復制代碼


 

 

          1.32:過期策略:從創建cache開始,一段時間后自動過期。
                           示例代碼:

復制代碼
//絕對緩存

Cache.Insert("EMP_NAME", "Shubhabrata", null,DateTime.Now.AddDays(1), Cache.NoSlidingExpiration);

//滑動緩存

Cache.Insert("EMP_NAME", "Shubhabrata", null,Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(60));
復制代碼

 


       1.4 ASP.NET 頁面輸出緩存

          有的時候在web站點中,有些頁面在很長一段時間內都不會發生變化,例如一個招聘網站,它對於工資的描述文字一般不會經常更改,一般都是一個月更改一次,所以在這一個月內,用戶看到的內容都是一樣的,所有如果把數據緩存在服務器端並不是完美的解決方案。這里可以用頁面輸出緩存。

OutputCache參數介紹:

         下面是示例代碼:
<%@OutputCache Duration="60" VaryByParam="empNum" Location="Server"%>

 

    2:客戶端緩存[主要介紹Cookies、ViewState、Hidden]:

          在上面的文章中,我討論了些數據緩存在服務器端的方法,然而有的時候我們為了提高性能我們要把有些數據緩存到客戶端。利用這種機制來達到緩解服務器壓力,不過在客戶端緩存數據會有各種不同的安全性問題,下面我說簡要的說下相關內容:

         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" />
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM