1. 程式人生 > >Asp.net 資料快取

Asp.net 資料快取

介紹:

          快取是一種在計算機中廣泛用來提高效能的技術,它將訪問頻率高或者構造成本高的資料保留在記憶體中。在Web應用程式的上下文中,快取用於在HTTP請求時保留頁或者資料,並在無須新建立的情況下多次使用它們。請記住,一旦應用程式停止或者重新啟動,其快取將被清除。

          在我解釋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失效,這種情況下,使用者的基本資訊就依賴於使用者編號。
                       下面是示例程式碼:

當EMP_NUM 被修改或不存在時,被依賴快取被清空

          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" />
複製程式碼