什麼是緩衝?
Web 應用程式通常都是被多個使用者訪問。一個Web網站可能存在一個“重量級”的載入,它能夠使得網站在訪問的時候,拖慢整個伺服器。當網站被大量使用者同時訪問的時候,訪問速度緩慢是大部分網站共同存在的問題。為瞭解決這個問題,我們可以使用一個更進階別的硬體設定,負載平衡器,高頻寬,但是載入並不是拖慢網站唯一的“罪魁禍首”,所以我們需要提供一種方案,它也同樣能夠加速資料訪問以及提升效能。而採用緩衝正是一種很不錯的解決方案。
緩衝是一種能夠儲存我們通常需要使用的資料的技術,它能夠把web 頁面暫時儲存在本地的硬碟上以供後續的檢索。這種技術在多個使用者同時訪問一個網站,或者一個使用者多次訪問一個網站時,有效地提升了訪問速度。為Web應用程式做的緩衝可以發生在用戶端(瀏覽器緩衝),可以作用在用戶端和服務端之間的一個伺服器上(代理緩衝/反向 Proxy緩衝),或者只作用在web伺服器本身(頁面緩衝或資料緩衝)。
我們可以選擇花費大量的時間來儲存快取資料以提升應用程式的效能,但這並沒有真正意義上達到我們的目的。因為如果我們考慮到Web 服務器的負載,我們就不得不考慮快取資料儲存的位置。接下來一節我們來討論緩衝的不同位置。
緩衝所在的不同位置
一個web應用程式的緩衝要麼處於用戶端(用戶端瀏覽器),在用戶端與伺服器之間(代理或反向 Proxy緩衝),要麼處於服務端(資料緩衝、網頁輸出快取)。所以我們就能夠區分出緩衝的位置:
1、 用戶端緩衝
2、 代理緩衝
3、 反向 Proxy緩衝
4、 Web伺服器端緩衝
1、 用戶端緩衝
在採用用戶端緩衝時,用戶端瀏覽器通過在本地硬碟上儲存緩衝的資料作為一個零時檔案,或者儲存在瀏覽器的內部儲存空間上來執行快取作業。它提供了一種快速存取相同資料的方式,因為它拒絕任何的網路載入以及服務端載入。該資料不能夠被其他用戶端共用,所以是用戶端專屬的。
優勢
1、 因為資料存放區在本地用戶端,所以可以很容易地訪問
2、 避免了網路傳輸
劣勢
1、 緩衝的資料獨立於瀏覽器,所以是無法被共用的
2、 代理緩衝
用戶端緩衝的主要的劣勢是資料存放區在用戶端瀏覽器,屬於用戶端私人的。而代理緩衝使用一種專屬的伺服器在服務端與用戶端之間以一種共用的“位置”來快取資料,所以所有的用戶端都可以使用相同的共用資料。Proxy 伺服器(例如微軟的Proxy 伺服器)來滿足所有對web頁面的請求,而無需將請求跨越網路傳輸到最終的web伺服器,這能夠使得快速存取成為現實。
代理緩衝通常位於網路的網關附近來減少頻寬的使用。有時通過多代理快取服務器的使用來緩解大量使用者訪問代理的壓力。這被稱之為一種緩衝叢集。
優勢
1、 資料被緩衝在Proxy 伺服器可以很容易就被訪問
2、 減少網路通訊
劣勢
1、 涉及到部署以及為了維護代理快取服務器的基礎設施的開銷
3、反向 Proxy緩衝
有些代理快取服務器可以被防止到網頁伺服器的前端來減少他們接受到的請求的數量。它允許Proxy 伺服器處理通常接受到的請求,而僅僅傳遞其他的“特殊”請求給伺服器。這稱之為反向 Proxy。
優勢
1、 被緩衝在反向 Proxy伺服器上的資料可以很容易地獲得
2、 減少請求的數目
劣勢
1、 當該伺服器被配置在web伺服器的前端,它可能導致額外的網路通訊
4、web伺服器緩衝
在web服務端做緩衝,緩衝的資料被儲存在web伺服器上。資料緩衝以及頁面緩衝可以使用web伺服器這種緩衝方案。
優勢
1、 提高網站的效能,減少了從資料庫以及其他伺服器檢索資料的開銷。
劣勢
1、 增加了網路載入開銷
緩衝的優勢
1、 減少服務端的負載
2、 減少了頻寬的消耗
ASP.NET中的緩衝
Asp.net提供對頁面、部分頁面(頁面片段),以及資料的緩衝。緩衝一個動態產生的頁面被稱之為網頁輸出快取。當一個動態產生的頁面被緩衝,它只是第一次被訪問。任何後續對相同頁面的請求都將從緩衝返回。Asp.net也提供快取頁面面部分的緩衝方式,被稱之為部分頁面緩衝或者頁面片段快取。當採用資料緩衝時被緩衝的服務端資料(例如來自資料庫的資料、XML資料)能夠被簡單地訪問,而無需做再次檢索。緩衝減少了從資料庫或其他資料來源擷取資料的開銷。Asp.net提供一種“全套的”資料緩衝引擎,包括清除(基於緩衝的優先順序),到期,檔案,鍵,以及時間依賴。在asp.net中,有兩種緩衝形式可以提升效能。
在上面的圖片中,(1)用來返回頁面的緩衝,這意味著它是用於輸出緩衝的,而(2)使用資料緩衝,通過儲存資料來減少擷取資料的開銷。
Asp.net支援兩種形式的到期策略,這決定了什麼時候對象將失效或者被從緩衝中移除。
絕對到期:絕對到期發生在一個標識的時間。絕對到期時間被標識為一種全日期格式(hh:mm:ss)。在標識的時間,對象將從緩衝中到期。
Asp.net 支援三種類型的緩衝:
1、 網頁輸出快取【輸出緩衝】
2、 頁面片段快取【輸出緩衝】
3、 資料緩衝
不同類型的緩衝
1、 網頁輸出快取:在開始網頁輸出快取之前,我們需要知道產生一個頁面的過程,因為基於產生的頁面,我們應該能夠理解為什麼我們應該使用緩衝。一個aspx頁面經過兩個階段的處理後被完成。首先,代碼被編譯進MSIL。然後,在執行期間,MSIL被編譯到本地代碼(通過JIT,即‘即時編譯器’)。當我們編譯網站的時候,一個asp.net頁面的整個代碼都被編譯如MSIL,但是在執行的時候,僅僅只有部分MSIL被轉換為本地代碼,這提升了效能。
現在,不管我們得到了什麼,如果有某個頁面不是經常的變化,JIT就不需要每次都編譯它。我們可以為那些內容相對靜態頁面使用輸出緩衝。而不是對每個使用者的請求,都去產生一個頁面,我們可以使用網頁輸出快取,以使得它可以從緩衝中訪問其自身。頁面只需要被產生一次,然後的請求都從緩衝中擷取。網頁輸出快取允許一個頁面的整個內容都儲存在緩衝中。
在這幅圖中,當第一次請求產生完頁面,頁面被緩衝,而對之後的相同頁面的請求,該頁面會被從緩衝中檢索出,而不是再次產生。
對輸出緩衝,一個OutputCache屬性可以被直接添加到任何一個asp.net頁面,指定一個該頁面被緩衝的期間(秒)
樣本
view plainprint?
- <%@ Page Language="C#" %>
- <%@ OutputCache Duration='300' VaryByParam='none' %>
- <html>
-
- <script runat="server">
- protected void Page_Load(Object sender, EventArgs e) {
- lbl_msg.Text = DateTime.Now.ToString();
- }
- </script>
-
- <body>
- <h3>Output Cache example</h3>
- <p>Page generated on:
- <asp:label id="lbl_msg" runat="server"/></p>
- </body>
- </html>
<%@ Page Language="C#" %><br /><%@ OutputCache Duration='300' VaryByParam='none' %><br /><html></p><p> <script runat="server"><br /> protected void Page_Load(Object sender, EventArgs e) {<br /> lbl_msg.Text = DateTime.Now.ToString();<br /> }<br /> </script></p><p> <body><br /> <h3>Output Cache example</h3><br /> <p>Page generated on:<br /> <asp:label id="lbl_msg" runat="server"/></p><br /> </body><br /></html>
我們也可以在後台代碼裡設定緩衝屬性
view plainprint?
- void Page_Load(Object sender, EventArgs e) {
- Response.Cache.SetExpires(DateTime.Now.AddSeconds(360));
- Response.Cache.SetCacheability(
- HttpCacheability.Public);
- Response.Cache.SetSlidingExpiration(true);
- _msg.Text = DateTime.Now.ToString();
- }
void Page_Load(Object sender, EventArgs e) {<br /> Response.Cache.SetExpires(DateTime.Now.AddSeconds(360));<br /> Response.Cache.SetCacheability(<br /> HttpCacheability.Public);<br /> Response.Cache.SetSlidingExpiration(true);<br /> _msg.Text = DateTime.Now.ToString();<br />}
我們不得不提及duration以及VaryByParam屬性。Duration定義緩衝將會持續多長時間。VaryByParam定義不同的緩衝參數值
就像上面展示的這幅圖一樣,如果我們對一個頁面使用一個查詢字串,我們需要基於該參數緩衝所有的頁面,我們可以使用VaryByParam屬性。基於查詢字串,資料應該被緩衝,當使用者請求一個頁面,並攜帶一個查詢字串(圖片中是ID),頁面也能夠在緩衝中被檢索到。下面的例子描述了VaryByParam屬性的使用。
樣本:
view plainprint?
- <%@ OutputCache Duration="60" VaryByParam="*" %>
- <! page would cached for 60 seconds, and would create a separate cache
- entry for every variation of querystring -->
<%@ OutputCache Duration="60" VaryByParam="*" %><br /><! page would cached for 60 seconds, and would create a separate cache<br /> entry for every variation of querystring -->
下面這幅圖展示了最通用也是最重要的輸出緩衝的屬性:
我們制定的所有outputCahce的屬性,都來自System.Web.HttpCachePolicy類的執行個體。由asp.net提供的緩衝策略的完整實現都封裝在HttpCachePolicy類中。
輸出緩衝位置
就像我剛才提到的,我們可以儲存快取資料在不同的地方——用戶端,伺服器,Proxy 伺服器。現在,我將怎麼設定快取資料的位置。如果我們儲存快取資料,它將從緩衝中檢索出頁面從而節省了頁面的產生時間。但是另一種方式是可以儲存資料在用戶端瀏覽器,它可以減少網路通訊。而OutputCache執行能夠使用所有的三種方式的緩衝——伺服器,用戶端,代理(預設)。
接下來的飆歌展示了緩衝位置的明細。它展示了緩衝處在的位置,以及對Cache-Control和到期時間頭的影響。
例如,如果你為Location屬性設定Client值,頁面將不會被儲存在服務端的緩衝中,但是響應中將包含一個Cache-Control回應標頭(通過使用Cache-Control頭,頁面可以指明是否他們應該被緩衝在一個代理上)設值為private,並且一個Expires頭(Http 響應,指明該頁面需要重新從伺服器請求的日期和時間)值為一個時間段,它是由Duration屬性指明的。
例子
view plainprint?
- <%@ OutputCache Duration='120' Location='Client' VaryByParam='none' %>
<%@ OutputCache Duration='120' Location='Client' VaryByParam='none' %>
該自理將儲存緩衝120秒,緩衝的資料不會儲存在服務端,而應該在用戶端瀏覽器。
2、頁面片段快取:asp.net提供一種對頁面片段的緩衝方案,稱之為頁面片段快取。為了緩衝一個頁面的一部分,你必須首先將這“部分頁面”封裝到一個使用者控制項中。在使用者控制項的源檔案中,加入一個outputcache指令,並指明Duration以及VaryByParam屬性。當使用者控制項在運行時被家載入一個頁面中,它將會被緩衝,並且所有的引用了相同使用者控制項的其他頁面也將能夠從緩衝中檢索資料。
接下來的樣本顯示了緩衝片段的一些細節:
樣本
view plainprint?
- <!— UserControl.ascx —>
-
- <%@ OutputCache Duration='60'
- VaryByParam='none' %>
- <%@ Control Language="'C#'" %>
-
- <script runat="server">
- protected void Page_Load(Object src, EventArgs e)
- {
- _date.Text = "User control generated at " +
- DateTime.Now.ToString();
- }
- </script>
- <asp:Label id='_date' runat="'server'" />
<!— UserControl.ascx —></p><p><%@ OutputCache Duration='60'<br /> VaryByParam='none' %><br /><%@ Control Language="'C#'" %></p><p><script runat="server"><br /> protected void Page_Load(Object src, EventArgs e)<br /> {<br /> _date.Text = "User control generated at " +<br /> DateTime.Now.ToString();<br /> }<br /></script><br /><asp:Label id='_date' runat="'server'" />
這裡我已經緩衝了一個使用者控制項,所以無論何時我們再一個頁面中使用它,該頁面的這部分都將會緩衝起來。
3、資料緩衝:資料緩衝能夠動態地提供一個應用程式的效能,因為它減少了資料檢索所帶來的一切“開銷”。其實很簡單,資料緩衝將請求的資料存放區在緩衝中,這樣web伺服器就不需要對到來的所有請求去請求資料庫伺服器,它能夠增加web網站的效能。為了實現資料緩衝,我們需要找到那些可訪問的並且非常普遍的資料。並且資料緩衝是也是一種“全套特性”的緩衝引擎,能夠使你在多個Http請求以及多個來自相同應用程式裡的會話之間檢索和儲存資料。
上面的圖片展示了資料如何從資料庫中北之間訪問以及資料是如何從緩衝中被重新檢索。資料緩衝不僅可以緩衝SQL Server中的資料,我們甚至能夠儲存1.4中所示的其他資料來源。
現在,讓我們看看如何在web應用程式中實現資料緩衝。這裡有三種不同的方式來將資料或者對象加入緩衝。但是,基於不同的方案,我們有不同的訪問資料的方式。這些方法是Cache[],Cache.add(),cache.insert()。接下來的表格向你清晰地展示了這三種方法的異同點:
Cache[]是一種非常容易使用的屬性,但cache.insert()以及cache.add()給我們對於快取資料更多的控制。
現在我們需要看看cache.insert()以及Cache.Add()的細節。Cache.Insert()有四個重載方法,而Cache.Add()怎沒有重載方法。接下來的表格展示了這些方法的大部分通用屬性。
開始的兩個是強制被Cache.Insert()方法使用的,而其他幾個則有所不同。
緩衝依賴
使用緩衝依賴,我們可以為某些資料或可能改變的實體設定依賴。所以我們能夠通過設定緩衝依賴來更新或者移除緩衝。在asp.net中支援三種類型的依賴:
(1) 基於檔案的依賴
(2) 基於鍵的依賴
(3) 基於時間的依賴
基於檔案的依賴:基於檔案的依賴,在當磁碟上的檔案改變時,可以讓一個通常的快取項目失效。
使用緩衝依賴,當檔案改變時,我們可以從緩衝中強制失效某些快取項目。我們可以設定多個檔案依賴。在這樣的情況下,依賴應該被建立在一組檔案或檔案夾上。
使用:基於檔案的依賴是非常有用的,當你需要更新更新的資料是基於某個檔案的時候。例如,一個新聞網站總是從一個檔案中去擷取資料,但是,如果某些爆炸性的新聞出來,他們只需要更新下檔案,然後緩衝就該失效,並且在失效時間之內,我們通過OnRemoveCallBack回調可以重新載入緩衝中的已被更新的資料。
基於鍵的緩衝依賴:基於鍵的依賴,在當另一個快取項目改變時,讓一個通常的快取項目失效。
使用:當我們有多個內部關聯對象在緩衝中時,這將會非常有用,我們需要更新或到期所有的這些對象。
基於時間的緩衝依賴:基於時間的依賴會讓一個快取項目在預定的時間失效。Cache的Cache.Insert()方法被用來建立一個基於時間的緩衝依賴。可以對其設定兩種類型的時間:
(1) 絕對時間
(2) “滑動”時間(相對的)
絕對:給一個快取項目設定一個失效的絕對時間。它是一個全時間格式,包含(hh:mm:ss)。
滑動:對每個請求重設快取項目的失效時間。當快取項目需要為了來自多個用戶端的請求都保持存活的時候,它是非常有用的。
對這些所有的依賴,asp.net允許下面的操作發生:
自動失效:那些在使用中並且沒有任何依賴的快取項目都會自動失效。
支援回調:緩衝對象能夠被配置來調用一個被“賦予”的一段代碼,當一個快取項目被從緩衝中移除時,這些代碼就會被調用。這給了你機會去更新緩衝。我們可以使用OnRemoveCallback()。
緩衝使用的注意事項
輸出緩衝注意事項:
1、 使得一個頁面上的輸出緩衝在通常情況下能夠訪問,對所有這些訪問都確保他們返回一致的內容。
2、 當對一個頁面使用輸出緩衝時,確保不引入不正確的行為,不為特定的使用者做處理。
3、 謹慎地決定快取頁面面的到期時間,平衡訪問速度與記憶體消耗以及快取一致性的正確訪問(輸送量)。
4、 如果你使用的是VaryByParam=’*’,考慮使用頁面滑動到期。
資料緩衝注意事項:
1、 資料緩衝不是一個共用的可更新狀態的容器
2、 緩衝的資料是通常需要訪問的以及擷取相對比較“昂貴”的。
3、 如果資料依賴於檔案,檔案夾,或者其他的緩衝實體,使用一種CacheDependency來確保它滿足當前的需求。
緩衝類型的建議
情境一:產生的頁面通常都相同,但是有某些展示的表單通常會更新(使用頁面片段快取)
情境二:產生的頁面總是在變化,但是有一些對象並不是經常變動(使用資料緩衝)
情境三:產生的頁面每隔幾個小時變化一次,當資訊通過一種自動處理過程從資料庫中被載入時(使用網頁輸出快取並且設定到期時間來匹配資料庫的更新時間)。
轉自:http://blog.csdn.net/yanghua_kobe/article/details/7093421