天天看點

Asp.net緩存簡介

概述

     緩存學術一些的解釋是”将常用資料放入易于讀取的地方以提高性能”。而對于Asp.net來說,需要被緩存的對象多種多樣,包括從資料庫中提取出來的資料,以及aspx頁面生成的靜态頁,甚至是編譯好的程式集。合理利用緩存能讓Asp.net的性能大幅提升,下面将對Asp.net中的緩存機制進行簡單概述。

緩存的分類

   在Asp.net中,大部分緩存機制是儲存在cache對象中,也就是伺服器記憶體的一部分。當使用者請求資料時,如果資料已經被緩存,則使用者所提取的資料直接從服務端傳回,而不是從資料庫等底層資料庫提取。這對性能的提升不得不說很有幫助。下面來看asp.net中幾種緩存機制。

程式集緩存

    簡單的說,這種緩存是asp.net自帶的,無需開發人員進行參與的緩存方式。即當第一次請求伺服器時,Page類以及相關程式集被編譯,當下次請求時,通路緩存後的編譯而不是重新編譯。CLR會自動檢測代碼的改變,如果代碼改變後,當下次通路時,相關代碼會被重新編譯。

資料源緩存

   資料源緩存,顧名思義,也就是利用資料源控件對擷取的資料進行緩存的方式。這些控件包括SqlDataSource,ObjectDataSource等:

    datasource

     作為抽象類的DataSourceControl暴漏了如下屬性用于緩存:

名稱 說明

CacheDuration 擷取或設定以秒為機關的一段時間,資料源控件就在這段時間内緩存 SelectMethod 屬性檢索到的資料。

CacheExpirationPolicy 擷取或設定緩存的到期行為,該行為與持續時間組合在一起可以描述資料源控件所用緩存的行為。

CacheKeyDependency 擷取或設定一個使用者定義的鍵依賴項,該鍵依賴項連結到資料源控件建立的所有資料緩存對象。

EnableCaching 擷取或設定一個值,該值訓示 ObjectDataSource 控件是否啟用資料緩存。

       而使用起來就非常簡單了,隻需要将緩存的相關屬性進行設定即可。比如我想要目前資料源緩存10秒,隻需要設定EnableCaching屬性和CacheDuration屬性如下:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 

            ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>" 

            SelectCommand="SELECT top 10 * FROM [Person].[Contact]" EnableCaching="true" CacheDuration="10"></asp:SqlDataSource>

這種方式的工作原理可以用下圖表示:

3

關于ObjectDataSource我推薦閱讀Caching Data with the ObjectDataSource

SQL Cache Dependency

     大家應該注意到了上面的資料源控件還暴漏了CacheKeyDependency屬性,這是用于實作SQL Cache Dependency的方式,關于Dependency,其實就是在資料庫表内容改變時,将相應的緩存進行更新,正如Dependency這個詞的意思一樣,是緩存依賴底層資料庫。下面就要說到兩種實作SQL Cache Dependency的方法了。

方法一:使用輪流查詢機制(polling-based):

     這種方式實作機制是在sql server中插入以AspNet_SqlCacheNotification_Trigger開頭的一個特殊的表和5個存儲過程,當被監測的表資料發生改變時,則一個名為AspNet_SqlCacheTablesForChangeNotification的表被更新,而Asp.net程式會根據使用者設定的間隔時間每隔一定時間檢查一下資料庫内容是否更新,如果更新,則将緩存中的資料進行跟新。

      這種機制配置相對比較麻煩。具體做法網上有很多教程,這裡我推薦閱讀:Using SQL Cache Dependencies.

      使用起來就很簡單了,可以在頁面頭部的OutputCache指令中設定,會社DataSource空間中進行設定,設定格式為:“資料庫名:表名”.裡面的表名即是需要監測是否改變的表名,示例如下:

<%@ OutputCache Duration="30" VaryByParam="none" SqlDependency="DatabaseName:tableName" %> 

    如果需要添加多個表,則用”;”進行分割

SqlDependency="database:table;database:table"

方法二:使用通知機制(notification-based)

      使用通知機制配置起來要簡便很多,但是sql server的版本需要9.0以上,也就是sql server 2005,使用這種方式需要将sql server的通知服務開啟。

      使用通知機制可以對頁面進行緩存,也可以對datasouce控件進行緩存,對頁面進行緩存代碼如下:

<%@ OutputCache Duration="30" VaryByParam="none" SqlDependency="CommandNotification" %>

   注意SqlDependency必須設定成CommandNotification。

   對于datasource控件,也是同樣:

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 

            SelectCommand="SELECT top 10 * FROM [Person].[Contact]" EnableCaching="true" CacheDuration="10" SqlCacheDependency="CommandNotification"></asp:SqlDataSource>

輸出緩存(output Caching)

      輸出緩存是頁面級别的緩存,是将aspx頁面内容在第一次請求後生成的靜态頁放入緩存,在不過期時間内每一次請求時從緩存中傳回靜态頁,而不是重新走完Asp.net的生命周期。可以将可以通過在頁面頭部加入OutputCache指令實作,也可以通過HttpCachePolicy類實作。

      輸出緩存可以緩存整個頁面,也可以緩存部分頁面,緩存頁面的一部分是通過使用者控件來實作。

      下面來看通過OutputCache指令實作頁面緩存:

       前面已經看到,這種方式十分簡單,下面說一下OutputCache的重點屬性

Duration

     頁面過期的時間,機關為秒。超過過期時間後,則在下一次請求時頁面會重新生成并緩存。

VaryByHeader

VaryByCustom

VaryByParam

VaryByControl

VaryByContentEncodings

      這些屬性都是為了儲存頁面的多個版本,比如說一個頁面用于顯示産品,則根據産品id的不同,緩存同一個頁面的不同版本,具體的意思請看MSDN

CacheProfile

      這個選項有些像連接配接字元串,作用隻是将具體的緩存選項變成對于選項的引用,比如我們在Web.Config放入如下代碼:

<caching>

        <outputCacheSettings>

          <outputCacheProfiles>

            <add name="CacheProfile"

                  enabled="true"

                  duration="60"

                   varyByParam="product:id"/>

          </outputCacheProfiles>

        </outputCacheSettings>

      </caching>

  則在引用時隻需要在頁面頭部設定如下:

<%@ OutputCache CacheProfile="CacheProfile" %>

  而不是全部寫入頁面

DiskCacheable

     因為伺服器記憶體是有限的,是以通過将DiskCacheable屬性設定為true,則可以将緩存頁面放入硬碟中,這樣即使伺服器崩潰重新開機,緩存依然存在.

緩存部分頁面

      緩存頁面的一部分實作原理和緩存整個頁面毫無二緻,都是在頁面頭部加入OutputCache指令,唯一的不同是緩存部分頁面是在使用者控件中進行的。這部分就不在多說了。

使用HttpCachePolicy緩存頁面

       前面已經說了通過OutputCache指令在頁面頭部設定緩存選項,另一種替代方法是使用HttpCachePolicy類,這個類的執行個體是Response.Cache.如果使用HttpCachePolicy設定緩存,則需要在頁面移除OutputCache指令。

      比如:

<%@ OutputCache  Duration="30" VaryByParam="state;city" %>

    和下面代碼是等價的:

  Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));

      Response.Cache.VaryByParams["state"] = true;

      Response.Cache.VaryByParams["city"] = true;

   更多關于HttpCachePolicy,請檢視MSDN

對象緩存

       對象緩存是将繼承與System.Object的對象緩存在伺服器的記憶體中,通過Page類的Cache屬性可以通路到Cache集合。Cache内可以放任何類型的對象,但是要小心使用Cache,因為Cache是占用伺服器記憶體,如果使用不當,也許會拖累性能。

      使用Cache的例子:

        //save object into Cache

        Cache["table"] = GridView1;

        //get object from Cache

        GridView gv = (GridView)Cache["table"];

   要注意的是,再提取緩存中的對象時,一定别忘了強制轉換。

總結

     文中對Asp.net的緩存機制進行了簡述,asp.net中的緩存極大的簡化了開發人員的使用。如果使用得當,程式性能會有客觀的提升。

本文轉自CareySon部落格園部落格,原文連結:http://www.cnblogs.com/CareySon/archive/2010/03/08/1681063.html,如需轉載請自行聯系原作者