《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > ASP.NET中緩存技術(shù)的應(yīng)用研究
ASP.NET中緩存技術(shù)的應(yīng)用研究
李用江
湛江海洋大學 計算機科學與技術(shù)系,廣東 湛江524088
摘要: 介紹了ASP.NET中各種緩存技術(shù)的應(yīng)用程序模型,并重點分析了每種應(yīng)用模型的優(yōu)缺點及其適用范圍。
Abstract:
Key words :

摘   要: 介紹了ASP.NET中各種緩存技術(shù)的應(yīng)用程序模型,并重點分析了每種應(yīng)用模型的優(yōu)缺點及其適用范圍。
關(guān)鍵詞: ASP.NET  高速緩存  Cookie  會話狀態(tài)  應(yīng)用程序狀態(tài)  視圖狀態(tài)

  隨著經(jīng)濟全球化的發(fā)展,許多公司面對客戶和市場需求的變化,需要構(gòu)建足夠強大、靈活、可伸縮的信息系統(tǒng)來支撐迅速增加的大量無規(guī)律性的訪問和Web流量。
  要開發(fā)高性能、可縮放的 Web 應(yīng)用程序,最好的方法是在首次請求項時將這些項存儲在Web服務(wù)器上或請求流中的其他軟件上,從而避免重新創(chuàng)建滿足先前請求的信息,可節(jié)省時間和資源。這就要使用數(shù)據(jù)緩存功能。ASP.NET提供了許多緩存功能。為了知道應(yīng)用程序應(yīng)該用哪一種緩存功能,需要了解將要開發(fā)的應(yīng)用程序的結(jié)構(gòu)和每種緩存功能的工作特點及其優(yōu)缺點。作者在軟件開發(fā)過程中,積累了有關(guān)這方面的一些經(jīng)驗,現(xiàn)整理出來供大家參考。
1  緩存數(shù)據(jù)的分類
  在Web應(yīng)用程序中,由于變量的生命周期受限于網(wǎng)頁,所以,每當.aspx文件被解釋執(zhí)行后,變量的內(nèi)容將不復存在。為將變量的內(nèi)容保存下來,簡單的方法是使用緩存來存儲變量的值。ASP.NET提供了輸出緩存和應(yīng)用程序數(shù)據(jù)緩存二種方案,用來創(chuàng)建高性能Web應(yīng)用程序的緩存類型[2]。
緩存數(shù)據(jù)按其所在網(wǎng)絡(luò)節(jié)點位置的不同可以分為三類[1][6]:(1)在客戶端緩存數(shù)據(jù)。(2)在Web服務(wù)器上維護緩存數(shù)據(jù)。(3)在數(shù)據(jù)庫中維護緩存數(shù)據(jù)。它是用數(shù)據(jù)庫儲存Web應(yīng)用程序的全局或會話數(shù)據(jù)的一種方式。
2  各種緩存技術(shù)的應(yīng)用模型
2.1 無狀態(tài)方式——不維護緩存狀態(tài)
  在軟件開發(fā)中,并非必須使用緩存來保存數(shù)據(jù),完全可以通過Web應(yīng)用程序的ASP.NET代碼執(zhí)行查詢并用綁定控件將結(jié)果轉(zhuǎn)換為HTML,從而避免緩存數(shù)據(jù),使ASP.NET代碼完全是無狀態(tài)的。
  (1)優(yōu)點:由于不需要在ASP.NET代碼中緩存數(shù)據(jù),所以應(yīng)用程序的每位用戶需要的內(nèi)存是最小的。如果單純從內(nèi)存使用的角度看,這種方式最具有伸縮性。
  (2)缺點:應(yīng)用程序的性能差。假設(shè)應(yīng)用程序是一個在線目錄,則需要在所有頁上顯示產(chǎn)品目錄列表。如果每次用戶訪問頁時都對數(shù)據(jù)庫進行查詢以得到產(chǎn)品目錄的列表,則將浪費寶貴的數(shù)據(jù)庫連接資源,降低系統(tǒng)的性能。
2.2 在客戶端緩存數(shù)據(jù)
  這類方法通常是利用瀏覽器(如Explorer)本身固有的緩存機制來實現(xiàn)的。瀏覽器把一定時間內(nèi)用戶訪問過的文檔或數(shù)據(jù)都存儲起來,當用戶重新訪問同樣的信息時就可以從瀏覽器的緩存中取出,而不需要重新建立HTTP連接。但是,由于必須將信息發(fā)送到客戶端進行存儲,因此這種方式可以存儲的信息量存在一定的客觀限制。
2.2.1 Cookie
  Cookie 用于在客戶端上存儲少量經(jīng)常更改的信息。許多Web站點用Cookie在客戶端儲存用戶信息,這些信息與請求一起發(fā)送到服務(wù)器。ASP.NET的Request和Response對象都公開一個Cookies集合,可以用它在服務(wù)器和客戶端往返行程之間儲存和獲取信息。
  (1)優(yōu)點:①簡單。Cookie是具有簡單鍵值對的、輕量的、基于文本的結(jié)構(gòu)。②可伸縮性好。不需要任何服務(wù)器資源,在客戶端儲存數(shù)據(jù)使ASP.NET代碼成為無狀態(tài)的,這可改進可伸縮性。③可配置到期時間??梢酝ㄟ^設(shè)置HttpCookie對象的Expires屬性,控制Cookie的失效時間。
  (2)缺點:①儲存量大小受到限制。對于緩存返回許多行的查詢結(jié)果并不適用。②與瀏覽器安全設(shè)置有關(guān)。在瀏覽器的安全設(shè)置中,可以選擇允許或拒絕創(chuàng)建Cookie,如果瀏覽器選擇禁止接受任何Cookie,則拒絕用Cookie儲存用戶的數(shù)據(jù)。③安全性差。由于用戶可以修改在客戶端儲存的Cookie內(nèi)容,所以不可用來存儲像密碼之類的敏感信息。④持久性??蛻舳擞嬎銠C上Cookie的持久性受到客戶端Cookie到期進程以及用戶干預的制約。
2.2.2 隱藏域
  可以在頁上的隱藏域中存儲特定于頁的信息,方法類似于Windows窗體中的隱藏控件。ASP.NET提供HtmlInputHidden控件,該控件提供隱藏域功能。但最好使用同它功能類似的ViewState。
  (1)優(yōu)點:①簡單。②可伸縮性好。無需服務(wù)器資源,隱藏域在頁上存儲并讀取。③與瀏覽器安全設(shè)置無關(guān)。幾乎所有瀏覽器和客戶端設(shè)備都支持具有隱藏域的窗體。
  (2)缺點:①有限的存儲結(jié)構(gòu)。隱藏域不支持豐富的結(jié)構(gòu),隱藏域提供在其中放置信息的單值域。②安全性差。如果直接查看頁輸出源,可以看到隱藏域中的信息,這導致潛在的安全性問題。③性能降低。由于隱藏域存儲在頁本身,因此,如果存儲較大的值,則在用戶顯示頁和發(fā)送頁時,頁的速度就可能會減慢。
2.2.3 視圖狀態(tài)(ViewState)
  在System.Web.UI名稱空間的Page類公開了一個ViewState屬性,它包含一個類似于名稱/值對集合的StateBag對象。ASP.NET頁框架將ViewState存儲到一個字符串變量,將它發(fā)送到客戶端并作為隱藏變量返回。在回發(fā)時,頁框架分析來自隱藏變量的輸入字符串并填充每一控件的ViewState屬性。
  (1)優(yōu)點:①可伸縮性好。②與瀏覽器安全設(shè)置無關(guān)。ViewState是在頁代碼內(nèi)結(jié)構(gòu)中的一個隱藏域中維護,所以,不管瀏覽器的安全設(shè)置如何,都可以用頁面的ViewState來儲存和獲取數(shù)據(jù)。③儲存量大。頁面可以在ViewState中保存大項目。④頁和控件狀態(tài)自動保持。
  (2)缺點:①安全性較低。雖然儲存在ViewState中的數(shù)據(jù)是散列的、壓縮的并且是為Unicode實現(xiàn)而編碼的,但用戶仍然可以解密儲存在頁面上的值。②性能降低。如果存儲較大的值,在用戶顯示頁和發(fā)送頁時,頁的速度就可能會減慢。③儲存數(shù)據(jù)的數(shù)據(jù)類型受限制。在ViewState中,只能儲存ASP.NET代碼清楚如何序列化的數(shù)據(jù),如字符串和整數(shù)這樣的簡單數(shù)據(jù)類型,但不能儲存一般對象。盡管如此,它仍然支持ISerializable接口的對象,如Dataset對象。
2.3 在Web服務(wù)器上維護緩存數(shù)據(jù)
  這類方法是在Web服務(wù)器上使用內(nèi)存作為緩存空間[6]。當服務(wù)器響應(yīng)用戶對某個數(shù)據(jù)請求后,在內(nèi)存緩存空間中保留一個副本,下一次如果有相同的訪問請求,就直接將緩存空間中的副本提供給用戶。這可加快服務(wù)器的反應(yīng)能力和增加服務(wù)器的吞吐量。服務(wù)器端的緩存機制能夠減小用戶的訪問延遲,與客戶端緩存相比具有更高的安全性。但可能使用更多的Web服務(wù)器資源,增加了服務(wù)器硬件和軟件的復雜度,當在信息存儲量較大時限制了應(yīng)用程序的可擴展性。
  ASP.NET提供了在服務(wù)器上維護狀態(tài)管理的四種方式。
2.3.1 會話狀態(tài)(Session)
  Page類公開一個Session屬性,可以在Session中存儲會話特定的值和對象,該Session對象將由服務(wù)器來進行管理并可用于瀏覽器或客戶端設(shè)備。存儲在Session變量中的理想數(shù)據(jù)是特定于單獨會話的短期的、敏感的數(shù)據(jù),直到用戶的會話中止。
  對Session的應(yīng)用,要先通過在文件Global.asax中進行設(shè)置,然后在.aspx頁面中進行調(diào)用。如可用下面的程序在Global.asax中加上一個Session_Start方法以定義要響應(yīng)的屬性。
  void Session_Start(Object sender,EventArgs e)
  {
  Session.Add(″lastvalue″,0);
  }
  賦予屬性一個初值,這樣當在頁面(.aspx)裝入時直接使用這個默認值。對Session值的應(yīng)用類似于對變量的使用(如Position=(int)Session[″lastvalue″]+1;),如果用它存儲數(shù)據(jù)集,則必須將其從Object強制轉(zhuǎn)換回數(shù)據(jù)集。
  (1)優(yōu)點:①易于實現(xiàn)。Session為ASP開發(fā)人員所熟悉,并且與其他.NET框架類一致。②安全性高。數(shù)據(jù)是由Web服務(wù)器而不是在瀏覽器中維護的,用戶不能通過瀏覽器來訪問或修改Session中的內(nèi)容。③與瀏覽器安全設(shè)置無關(guān)。Session可用于不支持HTTP Cookie的瀏覽器。④獨立性好。每個用戶的會話設(shè)置是分開的,不可共享。⑤會話特定的事件。會話管理事件可以由應(yīng)用程序引發(fā)和使用。⑥持久性。放置于會話狀態(tài)變量中的數(shù)據(jù)在經(jīng)過Internet信息服務(wù)(IIS)重新啟動和輔助進程重新啟動后,會話數(shù)據(jù)不會丟失。⑦平臺可縮放性。會話狀態(tài)對象可在多計算機和多進程配置中使用,因而優(yōu)化了可縮放性方案。
  (2)缺點:①可伸縮性差。應(yīng)用程序的每個會話都要在服務(wù)器上占用一定的資源,當有大量訪問Web應(yīng)用程序的用戶時,就應(yīng)考慮要使用的服務(wù)器資源總量。②性能降低。Session變量在被移除或替換前保留在內(nèi)存中,如果其中包含類似大型數(shù)據(jù)集的信息塊,則可能會因服務(wù)器負荷的增加而降低Web服務(wù)器的性能。
2.3.2 應(yīng)用程序狀態(tài)(Application)
  ASP.NET通過HttpApplicationState類將Application提供為一種存儲全局應(yīng)用程序特定信息的方法。Application對象與Session對象類似,不同的是通過頁面的Application屬性取得的數(shù)據(jù)是所有會話所共享的。插入到Application變量的理想數(shù)據(jù)是那些由多個會話共享并且不經(jīng)常更改的數(shù)據(jù)。
  (1)優(yōu)點:①易于實現(xiàn)。②與瀏覽器安全設(shè)置無關(guān)。③共享性高。因為儲存在Application中的數(shù)據(jù)對應(yīng)用程序的所有會話都是可用的,所以它是儲存所有會話都能使用的穩(wěn)定性數(shù)據(jù)(如產(chǎn)品目錄列表)的理想位置。
  (2)缺點:①可伸縮性差。②持久性。因為在Application中存儲的全局數(shù)據(jù)是易失的,所以如果包含這些數(shù)據(jù)的 Web服務(wù)器進程被損壞,將丟失這些數(shù)據(jù)。③全局范圍。在Application中存儲的變量僅對于該應(yīng)用程序正在其中運行的特定進程而言是全局的,并且每一應(yīng)用程序進程可能具有不同的值。因此,不能依賴Application來存儲惟一值或更新網(wǎng)絡(luò)園和網(wǎng)絡(luò)場配置中的全局計數(shù)器。④性能降低。當服務(wù)器負載增加時,就會降低Web服務(wù)器的性能,但比在Session中維護數(shù)據(jù)的情況要好。
2.3.3 Cache
  Page對象公開一個Cache屬性,可以將Cache對象想象為更健壯的Application對象。儲存在Cache中的數(shù)據(jù)對應(yīng)用程序的所有會話都是可用的??梢韵駥pplication對象一樣訪問和修改Cache對象的內(nèi)容[3]。
但在通過Add或者Insert方法向Cache添加項目時,Cache對象還提供了下面的附加功能:
  (1)可以通過提供具體值(DateTime)或者相對值(Time-
  Span)來指定何時從緩存中刪除該項。
  (2)可以指定CacheDependancy,它會在dependent項改變時迫使項從緩存中刪除。
  (3)可以指定當項從緩存中被刪除時,ASP.NET要調(diào)用的回調(diào)函數(shù)。
  使用Cache對象的優(yōu)點及缺點與Application對象的很相似,只是Cache對象還提供了額外的緩存刪除功能。
  下面給出一個使用Cache存儲大數(shù)據(jù)的示例。在下面的Web表單中,對第一次請求從數(shù)據(jù)庫中檢索數(shù)據(jù),并把它存入到應(yīng)用程序緩存。將Dataset加入緩存時,設(shè)置5分鐘的到期限制,以便5分鐘內(nèi)的全部請求都使用緩存的Dataset。對于緩存Dataset到期之后出現(xiàn)的第一次請求,數(shù)據(jù)庫又會被訪問,新的Dataset開始緩存。為了證實這一觀點,Dataset第一次被創(chuàng)建,就把“鍵—值”對加入到DataSet.ExtendedProperties集合中,這是一個能保存用戶定義的“鍵—值”對集合。用它可存儲Dataset生成時間,這樣就可把它顯示到頁面上。
  下面的方法用于在Cache中存儲數(shù)據(jù)并在控件DataGrid1中顯示。
  private void datasetshow( )
{/**構(gòu)建新的DataSet,并用Cache的Get的方法的結(jié)果為它賦值,該方法返回匹配指定鍵名的Object實例,并強制將它轉(zhuǎn)化為一個DataSet對象*/  

  DataSet myDataSet=(DataSet) Cache.Get(″CacheddataSet″);
  if (myDataSet==null)
  {//dataLocationLabel記錄DataSet所在的位置及時間
  dataLocationLabel.Text=″<p>第一次來!時間是:″+
  DateTime.Now.ToLongTimeString( )+″</p>″;
  myDataSet=new DataSet( );
             //登錄數(shù)據(jù)庫服務(wù)器并填充數(shù)據(jù)集
  login(″sa″,myDataSet);
               //記錄創(chuàng)建時間
  myDataSet.ExtendedProperties.Add(″creattime″,
  DateTime.Now.ToLongTimeString( ));
              //在Cache中插入一個DataSet對象,設(shè)置5分鐘到期限制Cache.Insert(″CacheddataSet″,myDataSet,null,DateTime.Now.AddMinutes(5),TimeSpan.Zero);
  }
  else {
  dataLocationLabel.Text=″<p>數(shù)據(jù)取自cache中,創(chuàng)建時間是:″+myDataSet.ExtendedProperties[″creattime″]+″</p>″+″<p>你這次來的時間是:″+DateTime.Now.ToLongTimeString( )+″</p>″;
  }
    DataGrid1.DataSource=myDataSet.Tables[″authors″];
    DataGrid1.DataBind( );
  }
2.3.4 輸出緩存
  輸出緩存允許將動態(tài)頁或用戶控件響應(yīng)存儲在輸出流(從發(fā)起服務(wù)器到請求瀏覽器)中任何具備HTTP 1.1緩存功能的設(shè)備上。當后面的請求發(fā)生時,不執(zhí)行頁或用戶控件代碼,緩存的輸出用于滿足該請求。
  (1)優(yōu)點:如果需要根據(jù)DataSet的內(nèi)容重復產(chǎn)生同樣的HTML,則輸出緩存就是最有效的,因為它在服務(wù)器端需要的處理更少。與Cache類似,可以控制輸出在緩存中保留的時間。
  (2)缺點:就像其他服務(wù)器端緩存功能一樣,輸出緩存仍然會消耗服務(wù)器上的資源。
2.4 在數(shù)據(jù)庫中維護狀態(tài)
  當應(yīng)用程序執(zhí)行一個非常復雜或者相當花費時間的查詢時,可以將查詢的結(jié)果儲存在數(shù)據(jù)庫服務(wù)器上的一個單獨數(shù)據(jù)表中,而不是每次在用戶請求下一頁的結(jié)果時都要執(zhí)行這個查詢[1]。
  (1)優(yōu)點:①無狀態(tài)性。②持久性??梢愿鶕?jù)需要在盡可能長的時間內(nèi)存儲數(shù)據(jù)庫信息,這些信息不受Web服務(wù)器可用性的影響。③安全性高。對數(shù)據(jù)庫的訪問要求嚴格的身份驗證和授權(quán),這種訪問通常非常安全。④可伸縮性好、應(yīng)用程序的性能高。使用這種方法即使數(shù)據(jù)量很大,對應(yīng)用程序的性能影響也不會大。⑤可靠性和數(shù)據(jù)完整性。數(shù)據(jù)庫包括多種用于維護有效的功能,其中包括觸發(fā)器和引用完整性、事務(wù)等。通過在數(shù)據(jù)庫中(而不是在會話狀態(tài)等對象中)保存有關(guān)事務(wù)的信息,可方便地從錯誤恢復。⑥可訪問性。存儲在數(shù)據(jù)庫中的數(shù)據(jù)可供多種信息處理工具訪問。
  (2)缺點:①復雜性。使用數(shù)據(jù)庫支持狀態(tài)管理意味著更復雜的硬件和軟件配置,這比將數(shù)據(jù)儲存在Session、Application、Cache、ViewState或者Cookie這樣的簡單對象或集合中更復雜。②性能降低。不佳的關(guān)系數(shù)據(jù)模型結(jié)構(gòu)可能導致擴展問題,對數(shù)據(jù)庫執(zhí)行過多的查詢可能會影響服務(wù)器性能。
3  結(jié)束語
  綜上所述,對于安全性要求高的應(yīng)用程序,應(yīng)當使用在Web服務(wù)器上維護緩存數(shù)據(jù)的方式;伸縮性要求高的應(yīng)用程序,應(yīng)當使用在客戶端上維護緩存數(shù)據(jù)的方式。儲存的數(shù)據(jù)越多,加載頁面的時間越長,系統(tǒng)的性能就差。如果需要儲存大量特定于會話的數(shù)據(jù),在數(shù)據(jù)庫中儲存數(shù)據(jù)是一種明智的選擇。
參考文獻
1   Sceppa D著,梁超,張莉,賀堃譯.ADO.NET技術(shù)內(nèi)幕.北京:清華大學出版社,2003
2   McClure W B,Croft J J著,李萬紅譯.構(gòu)建高度可伸縮的.NET數(shù)據(jù)庫應(yīng)用程序.北京:清華大學出版社,2003
3   Dickinson P著,張曉明譯.ADO.NET高級編程.北京:中國電力出版社,2003
4   劉楊.突破C#編程實例五十講.北京:中國水利水電出版社,2002
5   陳英學.Microsoft ASP.NET深入編程.北京:北京希望電子出版社,2001
6   樂德廣.網(wǎng)絡(luò)緩存技術(shù)及應(yīng)用的研究.計算機系統(tǒng)應(yīng)用,2003;(5)
7   李用江.數(shù)據(jù)庫中大文本數(shù)據(jù)存取方法的探討.計算機系統(tǒng)應(yīng)用,2004;(5)

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。