天天看點

緩存技術基礎

1. INTRODUCTION

  大量的網站頁面是采用動态的方式,根據使用者送出的不同請求建立生成頁面。正如我們所知的,動态頁面有助于根據使用者要求來提供定制的動态内容。動态頁面也利于擷取在資料庫中每時每刻更新的資料。缺點是為每個使用者請求生成同一頁面增加了系統開銷。

  ASP.NET 提供了緩存技術有助于我們最大程度地解決這個問題。它能緩存輸出的頁面,儲存在存儲器當中,緩存使用者請求的内容。緩存的特點可以根據不同方式來定制的。

  本文主要介紹ASP.NET的緩存技術。介紹其使用方法,以及用戶端緩存存在的問題。

  2. ASP.NET CACHE

  緩存是把應用程式中需要頻繁、快速通路的資料儲存在記憶體中的程式設計技術。ASP.NET提供三種主要形式的緩存:頁面級輸出緩存、使用者控件級輸出緩存(或稱為片段緩存)和緩存API。輸出緩存和片段緩存的優點是非常易于實作,在大多數情況下,使用這兩種緩存就足夠了。而緩存API則提供了額外的靈活性(實際上是相當大的靈活性),可用于在應用程式的每一層利用緩存。本文隻介紹頁面級緩存和使用者控件級緩存。

  2.1. Page Caching

  作為最簡單的緩存形式,輸出緩存隻是在記憶體中保留為響應請求而發送的 HTML 的副本。其後再有請求時将提供緩存的輸出,直到緩存到期,這樣,性能有可能得到很大的提高(取決于需要多少開銷來建立原始頁面輸出 - 發送緩存的輸出總是很快,并且比較穩定)。

  要實作頁面輸出緩存,隻要将一條 OutputCache 指令添加到頁面即可:

  <%@ OutputCache Duration="60" VaryByParam="*" %>

  如同其他頁面指令一樣,該指令應該出現在ASPX頁面的頂部,即在任何輸出之前。它支援五個屬性(或參數),其中兩個是必需的。

   Duration:必需屬性。頁面應該被緩存的時間,以秒為機關。必須是正整數。

   Location:指定應該對輸出進行緩存的位置。如果要指定該參數,則必須是下列選項之一:Any、Client、Downstream、None、Server 或 ServerAndClient。

   VaryByParam:必需屬性。Request 中變量的名稱,這些變量名應該産生單獨的緩存條目。"none" 表示沒有變動。"*" 可用于為每個不同的變量數組建立新的緩存條目。變量之間用 ";" 進行分隔。 

   VaryByHeader:基于指定的标頭中的變動改變緩存條目。

   VaryByCustom:允許在 global.asax 中指定自定義變動(例如,"Browser")。

  利用必需的 Duration 和 VaryByParam 選項的組合可以處理大多數情況。例如,如果您的産品目錄允許使用者基于 categoryID 和頁變量檢視目錄頁,您可以用參數值為 "categoryID;page" 的 VaryByParam 将産品目錄緩存一段時間(如果産品不是随時都在改變,一小時還是可以接受的,是以,持續時間是 3600 秒)。這将為每個種類的每個目錄頁建立單獨的緩存條目。每個條目從其第一個請求算起将維持一個小時。

  VaryByHeader 和 VaryByCustom 主要用于根據通路頁面的用戶端對頁面的外觀或内容進行自定義。同一個 URL 可能需要同時為浏覽器和行動電話用戶端呈現輸出,是以,需要針對不同的用戶端緩存不同的内容版本。或者,頁面有可能已經針對 IE 進行了優化,但需要能針對 Netscape 或 Opera 完全降低優化(而不僅僅是破壞頁面)。

  2.2. Fragment caching

  ASP.NET提供了部分緩存或區域緩存Web表單的功能。當希望在特定的頁面上實作對緩存更多的控制時,可以使用該技術。

  為了指定應該被緩存的使用者控件,我們利用 @OutputCache 指令,就象整個頁面緩存的用法一樣。

  <%@ OutputCache Duration=10 VaryByParam="*" %>

  該示例将緩存使用者控件60秒,并且将針對查詢字元串的每個變動、針對此控件所在的每個頁面建立單獨的緩存條目。

  <%@ OutputCache Duration="60" VaryByParam="none"

  VaryByControl="CategoryDropDownList" %>

  該示例将緩存使用者控件60秒,并且将針對CategoryDropDownList控件的每個不同的值、針對此控件所在的每個頁面建立單獨的緩存條目。

  還可以通過設定屬性Shared=”true”,讓使用它的所有頁面共享這個控件緩存。

  3. CONCLUSION AND SUGGESTION

  應該在應用程式的每一層都實作緩存。向資料層、業務邏輯層、UI 或輸出層添加緩存支援。記憶體現在非常便宜 — 是以,通過以智能的方式在整個應用程式中實作緩存,可以獲得很大的性能提高。

  緩存是一種無需大量時間和分析就可以獲得“足夠良好的”性能的方法。這裡再次強調,記憶體現在非常便宜,是以,如果您能通過将輸出緩存 30 秒,而不是花上一整天甚至一周的時間嘗試優化代碼或資料庫就可以獲得所需的性能,您肯定會選擇緩存解決方案(假設可以接受 30 秒的舊資料)。緩存正是那些利用 20% 付出獲得 80% 回報的特性之一,是以,要提高性能,應該首先想到緩存。不過,如果設計很糟糕,最終卻有可能帶來不良的後果,是以,您當然也應該盡量正确地設計應用程式。但如果您隻是需要立即獲得足夠高的性能,緩存就是您的最佳選擇,您可以在以後有時間的時候再盡快重新設計應用程式。

  ASP.NET緩存和IE緩存并不是同一個概念,IE緩存可能會導緻錯誤發生,而且很難控制,可以考慮禁止IE緩存,而隻采用ASP.NET緩存機制。

  針對我們的Web系統的特殊性,存在大量的頁面針對不同的使用者顯示不同的資料,是以在采用ASP.NET緩存機制時,請格外小心。可以考慮在緩存機制使用時增加一些必要的參數。