Web緩存技術

本章導讀html

緩存主要是爲了提升數據的讀取速度。由於服務器和應用客戶端之間存在着流量的瓶頸,因此讀取大容量數據時,使用緩存來直接爲客戶端服務,能夠減小客戶端與服務器端的數據交互,從而大大提升程序的性能。web

本章從緩存所在的命名空間「System.Web.Caching」開始,詳細介紹框架提供的緩存類和操做方法,主要涉及簡單數據的緩存、數據緩存依賴和數據庫緩存依賴三個技術要點,最後演示一個徹底使用緩存實現數據讀取的實例。講解流程如圖16-1所示。sql


圖16-1  緩存命名空間的講解流程數據庫

16.1  System.Web.Caching簡介

本節從緩存命名空間的整體簡介和組成結構入手,從總體上對System.Web.Caching進行概述。express

16.1.1  System.Web.Caching概述

System.Web.Caching是用來管理緩存的命名空間。緩存就是將服務器端的數據暫時保存在客戶端,方便用戶的讀取。緩存命名空間的父級空間是「System.Web」,由此能夠看出,緩存一般用於Web網站的開發,包括在B/S項目中的開發。緩存的設計主要是考慮到網絡帶寬可能會延緩數據的提交和回發,若是將數據保存在客戶端,用戶能夠直接從客戶端讀取數據,這樣數據就是從本地提取的,不會再受網絡的影響。編程

System.Web.Caching命名空間提供與緩存有關的全部操做類,具體包括哪些類將在下一節詳細介紹。數組

16.1.2  System.Web.Caching命名空間內的類組成

緩存命名空間主要提供三種操做:緩存數據對象、對象的緩存依賴和數據庫的緩存依賴。其中緩存任何對象都使用一個類Cache,但當緩存發生改變時,普通對象和數據庫對象的依賴處理不一樣。緩存

圖16-2羅列的是在三層結構中緩存的部署狀況。兩個依賴類CacheDependency和SqlCache Dependency主要更改發生變化的緩存數據,起到通知的做用。當數據沒有被緩存時,使用Cache類進行添加。服務器

下面根據圖16-2的部署,來介紹圖中使用的緩存類。這些類的說明如表16-1所示。網絡

 

圖16-2  三層結構中緩存的部署圖

表16-1  緩存命名空間中的類及其說明

    

    

Cache

對緩存對象的編輯類,其操做包括緩存的增、刪、改

CacheDependency

基本緩存對象的依賴,當基本對象發生變化時,更新緩存內容

SqlCacheDependency

數據庫緩存對象的依賴,當數據庫中的數據變化時,更新緩存內容

16.2  管理緩存的類:Cache類

Cache類用來存儲數據對象,並提供方法對這些對象進行編輯。本節主要介紹Cache類包含的方法,以及如何使用這些方法實現數據對象的緩存。

16.2.1  功能說明

Cache類屬於字典類,其根據必定的規則存儲用戶須要的數據,這些數據的類型不受限制,能夠是字符串、數組、數據表、Dataset和哈希表等。

使用Cache類的優勢是當緩存的數據發生變化時,Cache類會讓數據失效,並實現緩存數據的從新添加,而後通知應用程序,報告緩存的及時更新。

16.2.2  語法定義

Cache類的語法定義以下:

public sealed class Cache : IEnumerable

經過其定義能夠發現,Cache類是「sealed」定義的類,表示此類被密封,不能被繼承。同時Cache類還繼承了IEnumerable接口,表示容許對集合中的數據進行枚舉操做。

緩存的生命週期隨着應用程序域的活動結束而終止,也就是說只要應用程序域依然處於活動狀態,緩存就會一直保持,由於每一個應用程序域都會建立一個緩存實例。此實例的信息經過HttpContext對象的Cache屬性或Page對象的Cache屬性獲取。

下面的代碼演示如何將數組數據添加到緩存中:

ArrayList myarray = new ArrayList();        //建立數組數據

myarray.Add("1.學習園地");

myarray.Add("2.交流論壇");

myarray.Add("3.幫助");

Cache.Add("Category", myarray);        //將數組添加到緩存中

16.2.3  方法詳解

Cache類的方法主要提供對緩存數據的編輯操做,如增、刪、改等。其中最經常使用的方法及其說明如表16-2所示。

表16-2  Cache類的主要方法及其說明

    

    

Add

將數據添加到Cache對象

Insert

Cache中插入數據項,可用於修改已經存在的數據緩存項

Remove

移除Cache對象中的緩存數據項

Get

Cache對象中獲取指定的數據項,注意返回的是Object類型,須要進行類型轉換

GetType

Cache對象中獲取數據項的類型,判斷數據類型後,方便進行轉換

GetEnumerator

循環訪問Cache對象中的緩存數據項。注意其返回類型是「IDictionaryEnumerator

技巧:要想修改緩存數據,只須要從新爲緩存賦值便可。

最須要注意的是Add方法,其使用語法以下:

public Object Add (

     string key,

     Object value,

     CacheDependency dependencies,

     DateTime absoluteExpiration,

     TimeSpan slidingExpiration,

     CacheItemPriority priority,

     CacheItemRemovedCallback onRemoveCallback

)

在使用Add方法時,以上7個參數是必需的,其表明意義以下:

— 參數「key」表明緩存數據項的鍵值,必須是惟一的。

— 參數「value」表明緩存數據的內容,能夠是任意類型。

— 參數「dependencies」表示緩存的依賴項,也就是此項的更改意味着緩存內容已通過期。若是沒有依賴項,可將此值設置爲NULL。

— 參數「absoluteExpiration」是日期型數據,表示緩存過時的時間,.NET 2.0提供的緩存在過時後是可使用的,能使用多長時間,就看這個參數的設置。

— 參數「slidingExpiration」的類型表示一段時間間隔,表示緩存參數將在多長時間之後被刪除,此參數與absoluteExpiration參數相關聯。

— 參數「priority」表示撤銷緩存的優先值,此參數的值取自枚舉變量「CacheItemPriority」,優先級低的數據項將先被刪除。此參數主要用在緩存退出對象時。

— 參數「onRemoveCallback」表示緩存刪除數據對象時調用的事件,通常用作通知程序。

下面的代碼演示瞭如何應用Cache類的這些方法。在使用本代碼時須要注意,代碼中使用了Arraylist對象,因此須要添加對命名空間「System.Collections」的引用,同時使用Cache類別忘記了添加命名空間「System.Web.Caching」。

    protected void Page_Load(object sender, EventArgs e)

    {

        ArrayList myarray = new ArrayList();         //建立數組數據

        myarray.Add("1.學習園地");

        myarray.Add("2.交流論壇");

        myarray.Add("3.幫助");

        //將數組添加到緩存中——使用Add方法

        Cache.Add("Category", myarray, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.Normal, null);

        myarray[1] = "2.交流園地";                     //修改數組數據  

        Cache.Insert("Category", myarray);           //使用Insert方法修改緩存數據

        string tmpStr = "這是一個臨時數據";

        Cache["tmpdata"] = tmpStr;

        //使用Get方法獲取緩存數據

        Response.Write(Cache.Get("tmpdata").ToString()+"<br/>");/

        Cache["tmpdata"] = "這是一個臨時字符串";         //從新爲緩存賦值的技巧

        Response.Write(Cache.Get("tmpdata").ToString() + "<br/>");

        //使用GetType方法判斷緩存數據的類型

        if (Cache["Category"].GetType().Name == "ArrayList")

            Response.Write("類型是數組");

        //使用GetEnumerator方法遍歷緩存中的數據

        IDictionaryEnumerator mycache = Cache.GetEnumerator();

        while (mycache.MoveNext())

            Response.Write(mycache.Value + "<br/>");

        Cache.Remove("tmpdata");//使用Remove方法移除緩存的臨時數據

}

技巧:在使用GetType方法時,若是要判斷類型,須要使用Object.GetType().Name屬性獲取類型的名稱。

上述代碼的運行結果以下:

這是一個臨時數據

這是一個臨時字符串

類型是數組這是一個臨時字符串

System.Collections.ArrayList

其中在讀取類型爲ArrayList的數據時,因爲沒有進行類型轉換,因此取出的是類型爲「System.Collections.ArrayList」的對象。本書會在本節最後的實例中介紹如何讀取數組的詳細內容。

16.2.4  屬性詳解

Cache類的屬性主要用來獲取緩存數據的一些基本信息,如緩存的項總數、指定位置的緩存項等。本書主要介紹兩個屬性:Count和Item。

Count用來獲取緩存中全部的項的總數。使用方法以下:

Response.Write(Cache.Count);

Item用於返回指定項的內容,通常繼承「IEnumerable」接口的類都有這樣的屬性,注意項須要使用「[ ]」包裝。其使用方法以下:

Response.Write(Cache[「Category」].ToString());

16.2.5  典型應用:實現數據的緩存快速讀取功能

Cache主要用來緩存使用頻率高且不需常常更新的數據。本例實現一個目錄列表的緩存。爲了簡便,列表的內容並無從數據庫中讀取,而是保存在一個ArrayList對象中。

本例的目的是將目錄列表填充到下拉框中,當緩存失效後,目錄列表的內容爲空。演示的步驟以下所述。

  在VS2005中建立一個網站,命名爲「CacheSample」。

  打開默認生成的Default.aspx頁,在其中添加一個下拉列表框和一個按鈕。

  按F7鍵切換到頁面的代碼視圖。不要忘記對命名空間的引用,代碼以下:

using System.Web.Caching;

using System.Collections;

   在「Page_Load」事件中判斷是否存在目錄緩存,若是沒有,則將目錄添加到緩存中。詳細代碼以下所示,其中目錄列表的保存時間是5秒。

protected void Page_Load(object sender, EventArgs e)

{

    if (!Page.IsPostBack)

    {

       ArrayList myarray = new ArrayList();//假設ArrayList的內容來自數據庫

        myarray.Add("古代歷史");

        myarray.Add("當代文學");

        myarray.Add("流行小說");

        myarray.Add("武俠小說");

        if (Cache["Categorys"] == null)  //判斷是否存在緩存

        {

            //若是緩存不存在,則添加——保存時間是5秒

            Cache.Add("Categorys", myarray, null, DateTime.Now.AddSeconds(5),

                TimeSpan.Zero, CacheItemPriority.Normal, null);

        }

    }

}

  回到設計視圖,雙擊按鈕控件,切換到按鈕的事件代碼中。

  在按鈕的雙擊事件中,須要判斷是否有目錄的緩存,有則在下拉框中顯示目錄內容,沒有則清空下拉框。詳細代碼以下:

protected void Button1_Click(object sender, EventArgs e)

{

    if (Cache["Categorys"] != null)        //判斷緩存是否失效

    {

        //若是沒有失效,則取出緩存的列表,注意類型的轉換。

        DropDownList1.DataSource = (ArrayList)Cache["Categorys"];

        DropDownList1.DataBind();

    }

    else

    {

        DropDownList1.Items.Clear();   //若是已經失效,則清空列表

    }

}

  按Ctrl+S組合鍵保存全部的代碼,再按F5鍵運行程序。在5秒之內若是單擊按鈕,則正常顯示目錄列表,若是超過5秒,則緩存對象已經不存在,因此下拉列表框的內容爲空。

本節主要介紹了Cache類的使用方法,其中並無涉及緩存依賴內容,即當實際數據改變時,緩存是否隨着改變。下一節將經過學習「CacheDependency」類瞭解緩存依賴的詳細實現。

16.3  緩存依賴類:CacheDependency類

CacheDependency類是架設在Cache類和實際數據之間的橋樑。本節將詳細介紹如何利用CacheDependency類實現數據緩存的及時更新。

16.3.1  功能說明

CacheDependency類被稱爲是緩存依賴類,其具體意義表如今當緩存對象的實際數據發生改變時,它能及時通知緩存對象。例如緩存對象「Category」保存的是一個XML文件的數據,若是XML文件發生了變化,那麼系統經過CacheDependency類就會及時更新緩存對象「Category」的內容,這樣就能保證用戶讀取的永遠是最新的數據。

16.3.2  語法定義

CacheDependency類的語法定義以下:

public class CacheDependency : IDisposable

其中繼承了接口「IDisposable」,此接口主要用來定義釋放分配的非託管資源的方法。繼承此接口必須實現方法Dispose,以實現資源的釋放。

CacheDependency類的構造函數實現了8個重載,下面的代碼列出了這些重載的函數,並詳細說明了各函數的參數。瞭解這些函數就能夠知道CacheDependency究竟能爲緩存帶來什麼優點。

    //假設緩存的來源文件是當前目錄下的data.xml文件

    //緩存依賴的文件路徑

    CacheDependency mydep = new CacheDependency("data.xml");

    //緩存依賴的文件能夠有多個

    CacheDependency mydep1=new CacheDependency(new string []{"data.xml","data1.xml"});

    //檢查緩存依賴更改的依據時間

    CacheDependency mydep2 = new CacheDependency("data.xml", DateTime.Now);

    //檢查多個依賴文件更改的依據時間

    CacheDependency mydep3 = new CacheDependency(new string[] { "data.xml", "data1.xml" }, DateTime.Now);

    //檢查依賴多個文件,也依賴多個緩存鍵值

    CacheDependency mydep4 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

        new string[] { "Category", "Category1" });

    //關聯依賴,還能夠依賴於另外一個文件緩存依賴

    CacheDependency mydep5 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

        new string[] { "Category", "Category1" }, mydep);

    //文件和鍵值上次修改的依據時間

    CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

        new string[] { "Category", "Category1" }, DateTime.Now);

    //文件、另外一個緩存依賴和鍵值上次修改的依據時間

    CacheDependency mydep6 = new CacheDependency(new string[] { "data.xml", "data1.xml" },

new string[] { "Category", "Category1" }, mydep,DateTime.Now);

16.3.3  方法和屬性

雖然CacheDependency類完成了很重要的功能,但其組成結構卻比較簡單,主要有兩個屬性和一個方法。

— 屬性「HasChanged」:判斷CacheDependency對象是否已更改。

— 屬性「UtcLastModified」:返回上次依賴項的修改日期

— 方法「Dispose」:釋放CacheDependency對象所佔有的資源。由於緩存類繼承了接口「IDispose」,因此必須實現此方法。

因爲緩存類的構成比較簡單,本節並無給出演示代碼,屬性和方法的使用將在下一節的實例中演示。

注意:只有Cache類的Insert和Add方法才能夠爲緩存添加依賴項。

16.3.4  典型應用:用CacheDependency獲取最新的數據

本例主要演示如何使用CacheDependency類實現數據的及時更新。實例中使用一個GridView控件顯示XML文件的數據,當XML文件的數據發生改變時,客戶端能夠及時更新。其實現的功能如圖16-3所示。

 

圖16-3  用CacheDependency獲取最新數據的功能實現圖

演示的詳細步驟以下所述。

     打開VS2005,建立一個網站,命名爲「CacheDependencySample」。

     在網站根目錄下,添加一個XML文件,用來爲控件提供數據,內容以下:

<?xml version="1.0" encoding="utf-8" ?>

<book>

     <bookinfo>

         <name>英國古代</name>

         <price>28.00</price>

     </bookinfo>

     <bookinfo>

         <name>中國歷史</name>

         <price>20.00</price>

     </bookinfo>

</book>

     打開默認生成的Default.aspx頁,添加一個GridView控件和一個按鈕控件。

     按F7鍵切換到窗體的代碼視圖,在Page_Load事件中書寫生成緩存的代碼。詳細內容以下:

private static CacheDependency mydepen;

protected void Page_Load(object sender, EventArgs e)

{

    if (!IsPostBack)

    {

        //建立XML數據源

        DataSet myds = new DataSet();

        //數據源來自文件data.xml

        myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));

        //判斷是否存在緩存

        if (Cache["BOOKS"] == null)

        {

            //建立緩存依賴

           mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath

                + @"/data.xml"));

            //添加緩存項

            Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,

                CacheItemPriority.Normal, null);

        }

    }

}

注意:使用XML文件讀取方法,必須添加XML操做方法所在的命名空間「System.Xml」。

     切換回設計視圖,再雙擊按鈕控件,此時光標停靠在按鈕的Click事件內。在此事件內書寫代碼,判斷XML文件的數據是否已更新,若是已更新則給出提示,並從新添加緩存依賴項,不然直接從緩存讀取GridView控件的數據。

     在「Button1_Click」事件內書寫的詳細代碼以下:

protected void Button1_Click(object sender, EventArgs e)

{

    //判斷緩存是否發生了變化

    if (mydepen.HasChanged)

    {

        Response.Write("Sorry,數據發生了變化!上次修改時間是:" + mydepen.UtcLastModified);

    }

    //判斷緩存項是否還在

    if (Cache["BOOKS"] == null)

        {

        //從新設置緩存項

            DataSet myds = new DataSet();

            myds.ReadXml(this.MapPath(Request.ApplicationPath + @"/data.xml"));

            mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + @"/ data.xml"));

        Cache.Add("BOOKS", myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,

CacheItemPriority.Normal, null);

        }

        GridView1.DataSource = Cache["BOOKS"];

        GridView1.DataBind();

}

注意:當XML文件發生改變後,其實緩存依賴和緩存項都被移除了,必須從新定義。

     按Ctrl+S組合鍵保存代碼的修改。再按F5鍵運行程序,單擊「獲取數據」按鈕,GridView就會顯示XML文件的內容。

     程序運行正常後,在後臺修改XML文件的內容,而後再單擊「獲取數據」按鈕,則出現更改數據的提示,同時GridView顯示了新的內容。圖16-4和圖16-5是數據更改前和更改後的效果對比。

                   

           圖16-4  初次獲取的數據效果圖                                圖16-5  更改數據後的顯示效果圖

16.4  數據庫緩存依賴類:SqlCacheDependency類

數據庫緩存依賴主要解決的是當數據庫的內容發生改變時,如何及時通知緩存,並更新緩存中的數據的問題。本節就介紹如何使用SQL Server 2005和.NET 2.0實現數據庫的緩存依賴。

16.4.1  功能說明

SqlCacheDependency類的使用須要結合SQL Server 2005數據庫,目前尚未Oracle數據庫的緩存依賴。

16.4.2  語法定義

SqlCacheDependency類的使用語法以下:

public class SqlCacheDependency : IDisposable

其中繼承了接口「IDisposable」,此接口主要用來定義釋放分配的非託管資源的方法。繼承此接口必須實現方法Dispose,用來實現資源的釋放。

SqlCacheDependency類主要的構造函數以下:

public SqlCacheDependency(string database,string table)

其中參數一表明要啓用緩存的數據庫,參數二表示緩存的表。在實際使用過程當中,只須要指明緩存的數據庫和表便可。

16.4.3  方法和屬性

SqlCacheDependency類的方法和屬性同CacheDependency類相同,主要有三個。

—  HasChanged:判斷數據庫緩存依賴是否發生了變化。

—  UtcLastModified:獲取緩存依賴上次更改的時間。

—  Dispose:釋放緩存依賴所佔用的資源。

這三個成員的使用方法同CacheDependency類的成員類似,本節再也不贅述。

在下節要介紹的使用實例中,將再也不使用代碼的方式實現緩存依賴,而是使用「OutputCache」在.NET 2.0中提供的SqlCacheDependency參數實現數據庫表的緩存。若是要使用編程的方式實現此功能,可參考CacheDependency類的實例。

16.4.4  使用SqlCacheDependency類的操做流程

要實現數據庫緩存依賴,必須結合數據庫的操做。在使用數據庫緩存依賴前,必須進行5步操做。詳細流程如圖16-6所示。

只有具有了上述條件,才能夠正常地使用數據庫緩存依賴。下一節將結合這5步操做演示如何實現數據庫的緩存依賴。

            圖16-6  使用數據庫緩存依賴的流程

16.4.5  典型應用:獲取數據庫表最新數據的實例

本例要實現的功能是當數據庫的內容發生變化時,保存在緩存中的數據項被更新。具體演示的步驟以下所述。

     在數據庫中建立數據庫「testCache」。

     在數據庫「testCache」中添加表「CacheTable」,其信息如表16-3所示。

表16-3  CacheTable表的信息

    

字段類型

    

id

int

自增加數據標識

Name

nvarchar(20)

書名

bookPublish

nvarchar(50)

出版社

Price

decimal(6,2)

書的價格

     爲數據庫啓用緩存通知。打開「開始」|「全部程序」|「Microsoft Visual Studio 2005」|「Visual Studio Tools」|「Visual Studio 2005命名提示」菜單命令。

   輸入以下命令,其中「-ed」和「-et」分別表明啓用緩存依賴數據庫和啓用緩存數據表。
         aspnet_regsql.exe -S  SqlServer服務器 -E -ed -d  數據庫名稱 -et -t  表名
         注意若是使用的數據庫驗證方式是「SQL Server身份驗證」,則須要使用以下的啓動命令:
         aspnet_regsql.exe -S  SqlServer服務器  -U <Username> -P <Password> -ed -d 數據庫名稱 -et -t 表名
        輸入命令後,按回車鍵。若是執行成功,效果如圖16-7所示。

     打開VS2005,新建一個網站,命名爲「SqlCacheDependency」。

     按F5鍵運行程序,主要目的是生成一個默認的Web.Config文件。而後關閉運行的程序。

     在Web.config中配置數據庫鏈接字符串,代碼以下:

     <connectionStrings>

         <add name="TestCacheConnectionString" connectionString="Data Source=CGJ-57F90 CCA64C\sqlexpress;Initial Catalog=testCache;Integrated Security=True" providerName= "System.

Data.SqlClient"/>

     </connectionStrings>

  

  圖16-7  啓用數據庫緩存依賴成功的提示圖

    在「system.web」節點內,添加數據庫緩存依賴的配置,詳細代碼以下所示。注意配置中的「connectionStringName」屬性,要與前面建立的數據庫鏈接字符串的名字相對應。

<caching>

     <sqlCacheDependency enabled = "true" pollTime = "1000" >

         <databases>

              <add name="testCache"

                 connectionStringName="TestCacheConnectionString"

                 pollTime = "1000"      />

         </databases>

     </sqlCacheDependency>

</caching>

     按Ctrl+S組合鍵保存配置文件的更改。

     打開默認生成的Default.aspx頁,在設計視圖中添加一個GridView控件,用來顯示從數據庫獲取的數據。再添加一個Literal控件,主要用來顯示時間,經過時間判斷顯示的是不是緩存中的數據。

     爲GridView配置數據源。單擊其任務列表,在「選擇數據源」下拉框中,單擊「新建數據源」命令,打開數據源的配置嚮導。

     在打開的數據源類型窗口中,選擇「數據庫」,單擊「肯定」按鈕,出現選擇鏈接字符串窗口,經過下拉列表選擇剛剛建立的「TestCacheConnectionString」鏈接串。

     單擊「下一步」按鈕,出現「配置Select語句」對話框,在「列」列表框中選擇「*」,表示選中全部列。

     單擊「下一步」按鈕出現測試查詢對話框,而後單擊「完成」按鈕。

     按F7鍵切換到到代碼視圖,在「Page_Load」事件中添加以下代碼(主要是顯示當前的時間,用來判斷是不是緩存數據):

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

     按Ctrl+S組合鍵保存當前頁的設計,再按F5鍵運行程序。當刷新頁面時,能夠看到時間是不斷變化的,這說明數據並無來自緩存。

     打開Default.aspx頁,在源代碼視圖的「<@page 」行下面,添加以下所示代碼。其中使用的參數「SqlDependency」,就是用來添加數據庫緩存依賴的。

 <%@ OutputCache Duration="3600" SqlDependency="testCache:CacheTable" VaryByParam="none" %>

注意:Duration參數是表示緩存的過時時間,單位是毫秒。

     按F5鍵運行程序,此時再刷新頁面,發現當前的時間已經再也不變化,由於整個頁的數據被緩存了起來。

    此時修改數據庫的內容,而後刷新運行着的頁面,能夠發現,數據跟着發生了變化。這就是數據庫緩存依賴的體現。當數據庫內容更新時,無論緩存的時間有沒有到,緩存的內容都會被更新。

16.5  Session和Cache的區別

之前實現數據的緩存有不少種方法,有客戶端的Cookie,有服務器端的Session和Application。其中Cookie是保存在客戶端的一組數據,主要用來保存用戶名等我的信息。Session則保存對話信息。Application則是保存在整個應用程序範圍內的信息,至關於全局變量。一般使用最頻繁的是Session,那麼Session和Cache又有什麼區別呢?

本節結合使用經驗,詳細介紹Session緩存和Cache緩存的區別。

(1)最大的區別是Cache提供緩存依賴來更新數據,而Session只能依靠定義的緩存時間來判斷緩存數據是否有效。

(2)即便應用程序終止,只要Cache.Add方法中定義的緩存時間未過時,下次開啓應用程序時,緩存的數據依然存在。而Session緩存只是存在於一次會話中,會話結束後,數據也就失效了。

(3)Session容易丟失,致使數據的不肯定性,而Cache不會出現這種狀況。

(4)因爲Session是每次會話就被加載,因此不適宜存放大量信息,不然會致使服務器的性能下降。而Cache則主要用來保存大容量信息,如數據庫中的多個表。

(5)VS2005的測試版提供了將緩存保存在硬盤上的參數,但正式版中取消了這個功能,估計其在之後版本中會從新實現。而Session目前只能保存在內存中,對其性能有影響。

爲了提升Cache的有效利用率,建議對於不常常改動的數據使用Cache。

16.6  小結

本章主要介紹瞭如何使用System.Web.Caching命名空間下的類,主要包括如下三個:Cache, CacheDependency和SqlCacheDependency。Cache類主要用來建立緩存項,主要針對的是數據不常常改變,但又使用頻繁的數據表或文件。另兩個類是.NET 2.0新添加的緩存依賴服務。經過文件依賴或數據庫依賴,能夠實現緩存數據的及時更新。

經過本章的學習,但願能夠提升讀者編寫的網站的數據讀取速度,節約帶寬,爲Web 2.0時代的到來打下堅實的基礎。

 

出處:《C#實用開發參考大全》一書第16章。
參考: http://www.cnblogs.com/codecrazy/archive/2010/10/14/1851936.html

不怕範圍太大,大能夠寫上[^>]*)\1\s+>

相關文章
相關標籤/搜索