ASP.NET緩存技術 第一講

序言

        最近公司團隊內部搞分享,我選擇了我比較喜歡的數據緩存這部分來學習並分享,所以整理了一些資料,以便於更好的給大家講解,下邊就將我整理的東西分享給大家,裏邊有很多是蒐集到的資料,在此向原作者們表示感謝!

       這個系列共有三講,請關注第一講,第二講,第三講。下邊開始正文。

       有時候總聽到同學說網站運行好慢,不知如何是好;有時候也總見到一些同學寫的網站功能看起來非常好,但訪問性能卻極其的差。沒有“勤儉節約”的意識,勢必會造成“鋪張浪費”。如何應對這種情況,充分利用系統緩存則是首要之道。

      系統緩存有什麼好處呢?舉個簡單的例子,你想通過網頁查詢某些數據,而這些數據並非實時變化,或者變化的時間是有期限的。例如查詢一些歷史數據。那麼每個用戶每次查的數據都是一樣的。如果不設置緩存,ASP.NET也會根據每個用戶的請求重複查詢n次,這就增加了不必要的開銷。所以,可能的情況下儘量使用緩存,從內存中返回數據的速度始終比去數據庫查的速度快,因而可以大大提供應用程序的性能。畢竟現在內存非常便宜,用空間換取時間效率應該是非常划算的。尤其是對耗時比較長的、需要建立網絡鏈接的數據庫查詢操作等。

        緩存功能是大型網站設計一個很重要的部分。由數據庫驅動的Web應用程序,如果需要改善其性能,最好的方法是使用緩存功能。

緩存的分類

    從分佈上來看,我們可以概括爲客戶端緩存和服務器端緩存。如圖所示:

 

 

客戶端緩存—— 這點大家都有直觀的印象。比如你去一個新的網站,第一次可能要花一陣子時間才能載入整個頁面。而以後再去呢,時間就會大大的縮短,原因就在於這個客戶端緩存。現在的瀏覽器都比較智能,它會在客戶機器的硬盤上保留許多靜態的文件,比如各種gif,jpeg文件等等。等以後再去的時候,它會盡量使用本地緩存裏面的文件。只有服務器端的文件更新了,或是緩存裏面的文件過期了,它纔會再次從服務器端下載這些東西。很多時候是IE替我們做了這件事情。

 

服務器端緩存——有些東西沒法或是不宜在客戶端緩存,那麼我們只好在服務器端想想辦法了。服務器端緩存從性質上看,又可以分爲靜態文件緩存和動態緩存兩種。

 

(1)靜態文件緩存

   好多頁面是靜態的,很少改動,那麼這種文件最適於作靜態緩存。靜態緩存再此不做講解。

(2)動態緩存

    動態緩存是比較有難度的。因爲你在緩存的時候要時刻注意一個問題,那就是緩存的內容是不是已經過時了。因爲內容過時了可能會有很嚴重的後果。比如網上買賣股票的網站。你給別人提供的價格是過時的,那人家非砍了你不可。緩存如何發現自己是不是過時就是一個非常複雜的問題。

 在ASP.NET中,常見的動態緩存主要有以下幾種手段:

l  傳統緩存方式

l 頁面輸出緩存。

l  頁面局部緩存。

l  利用.NET提供的System.Web.Caching 緩存。

l  緩存依賴。

頁面輸出緩存

頁面輸出緩存是最爲簡單的緩存機制,該機制將整個ASP.NET頁面內容保存在服務器內存中。當用戶請求該頁面時,系統從內存中輸出相關數據,直到緩存數據過期。在這個過程中,緩存內容直接發送給用戶,而不必再次經過頁面處理生命週期。通常情況下,頁面輸出緩存對於那些包含不需要經常修改內容的,但需要大量處理才能編譯完成的頁面特別有用。需要讀者注意的是,頁面輸出緩存是將頁面全部內容都保存在內存中,並用於完成客戶端請求。

在ASP.NET中頁面緩存的使用方法非常的簡單,只需要在aspx頁的頂部加這樣一句聲明即可:

 

 

<%@OutputCacheDuration="60"VaryByParam="none"%>

 

Duration 

緩存的時間(秒)。這是必選屬性。如果未包含該屬性,將出現分析器錯誤。

 

<%@PageLanguage="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %>

<%@OutputCacheDuration="60" VaryByParam="none" %>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

    <title>頁面緩存示例</title>

</head>

<body>

    <formid="form1"runat="server">

    <div>

        <asp:LabelID="Label1"runat="server"Text="Label"></asp:Label>

    </div>

    </form>

</body>

 

</html>

 

 

       

後臺代碼:

       protected void Page_Load(object  sender,EventArgs e)

        {

            if  (!IsPostBack)

            {

                Label1.Text = DateTime.Now.ToString();

            }

 

        }

       

    如果不加<%@OutputCacheDuration="60"VaryByParam="none"%>,每次刷新頁面上的時間每次都是在變。而加了緩存聲明以後,每次刷新頁面的時間並不變化,60秒後才變化一次,說明數據被緩存了60秒。

 VaryByParam

是指頁面根據使用 POST 或 GET 發送的名稱/值對(參數)來更新緩存的內容,多個參數用分號隔開。如果不希望根據任何參數來改變緩存內容,請將值設置爲 none。如果希望通過所有的參數值改變都更新緩存,請將屬性設置爲星號 (*)。

例如:http://localhost:1288/Demo2.aspx?language=e
則可以在WebForm1.aspx頁面頭部聲明緩存:<%@OutputCacheDuration="60"VaryByParam=" language" %>

以上代碼設置頁面緩存時間是60秒,並根據language參數的值來更新緩存,即language的值發生變化才更新緩存。

如果一直是Demo2.aspx?language=e訪問該頁,則頁面會緩存當前數據,當language=c時又會執行後臺代碼更新緩存內容。

除此之外,@OutputCache還有一些其他的屬性。@OutputCache指令中的屬性參數描述如下:

 

<%@OutputCacheDuration="#ofseconds"

   Location="Any | Client | Downstream | Server | None |

     ServerAndClient "

   Shared="True | False"

   VaryByControl="controlname"

   VaryByCustom="browser | customstring"

   VaryByHeader="headers"

   VaryByParam="parametername"

   CacheProfile="cache profile name | ''"

   NoStore="true | false"

   SqlDependency="database/table name pair |  CommandNotification"

%>

 

 

CacheProfile

用於調用Web.config配置文件中設置的緩存時間。這是可選屬性,默認值爲空字符 ("")

例如:在Web.config中加入配置:

<system.web>

    <caching>

       <outputCacheSettings>

           <outputCacheProfiles>

               <addname="CacheTest"duration="50" />

           </outputCacheProfiles>

       </outputCacheSettings>

 </caching>

</system.web>

  

       

頁面中聲明:

%@OutputCacheCacheProfile="CacheTest" VaryByParam="none"%

 

注意:

包含在用戶控件(.ascx文件)中的 @ OutputCache 指令不支持此屬性。在頁中指定此屬性時,屬性值必須與 outputCacheSettings 節下面的  outputCacheProfiles 元素中的一個可用項的名稱匹配。如果此名稱與配置文件項不匹配,將引發異常。

       如果每個頁面的緩存時間相同,則不需要每個頁面設置,而是通過統一一個地方控制,這樣就可以更好的統一控制所有頁面的緩存時間。如果想改變緩存時間,只需要改一下web.config的配置信息即可,而不用每個頁面去修改。

VaryByControl

      通過控件文件中包含的服務器控件來改變緩存(值是控件ID,多控件用分號隔開)

在 ASP.NET頁和用戶控件上使用 @ OutputCache 指令時,需要該屬性或 VaryByParam 屬性。

 

<%@PageLanguage="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm2" %>

<%@OutputCacheDuration="60" VaryByParam="none" VaryByControl="DropDownList1" %>

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

    <title>根據控件頁面緩存</title>

</head>

<body>

    <formid="form1"runat="server">

    <div>

         <%=DateTime.Now%>        

        <br>

    <asp:DropDownListID="DropDownList1"runat="server">

        <asp:ListItem>beijing</asp:ListItem>

        <asp:ListItem>shanghai</asp:ListItem>

        <asp:ListItem>guangzhou</asp:ListItem>

        </asp:DropDownList>

        <asp:ButtonID="Button1"runat="server"Text="提交"/>

    </div>

    </form>

</body>

 </html>

 

以上代碼設置緩存有效期是60秒,並且頁面不隨任何GET或POST參數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控件中包含ID屬性爲“DropDownList1”的服務器控件(例如下拉框控件),那麼緩存將根據該控件的變化來更新頁面數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章