Asp.net中cache管理機制介紹

iDotNetSpace發表於2009-12-23

  介紹:

  在我解釋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站點中,有些頁面在很長一段時間內都不會發生變化,例如一個招聘網站,它對於工資的描述文字一般不會經常更改,一般都是一個月更改一次,所以在這一個月內,使用者看到的內容都是一樣的,所有如果把資料快取在伺服器端並不是完美的解決方案。這裡可以用頁面輸出快取。

  下面是示例程式碼:

    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--&gt 
    runat="server" />
  <!--In HTML--&gt
  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-623441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章