1. 程式人生 > >快取(cache與session的區別)

快取(cache與session的區別)

快取主要是為了提高資料的讀取速度。因為伺服器和應用客戶端之間存在著流量的瓶頸,所以讀取大容量資料時,使用快取來直接為客戶端服務,可以減少客戶端與伺服器端的資料互動,從而大大提高程式的效能。

本章從快取所在的名稱空間“System.Web.Caching”開始,詳細介紹框架提供的快取類和操作方法,主要涉及簡單資料的快取、資料快取依賴和資料庫快取依賴三個技術要點,最後演示一個完全使用快取實現資料讀取的例項。講解流程如圖16-1所示。

 

圖16-1  快取名稱空間的講解流程

16.1  System.Web.Caching簡介

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

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物件中。

本例的目的是將目錄列表填充到下拉框中,當快取失效後,目錄列表的內容為空。演示的步驟如下所述。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在VS2005中建立一個網站,命名為“CacheSample”。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟預設生成的Default.aspx頁,在其中新增一個下拉列表框和一個按鈕。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按F7鍵切換到頁面的程式碼檢視。不要忘記對名稱空間的引用,程式碼如下:

using System.Web.Caching;

using System.Collections;

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在“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);

        }

    }

}

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師   回到設計檢視,雙擊按鈕控制元件,切換到按鈕的事件程式碼中。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在按鈕的雙擊事件中,需要判斷是否有目錄的快取,有則在下拉框中顯示目錄內容,沒有則清空下拉框。詳細程式碼如下:

protected void Button1_Click(object sender, EventArgs e)

{

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

    {

        //如果沒有失效,則取出快取的列表,注意型別的轉換。

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

        DropDownList1.DataBind();

    }

    else

    {

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

    }

}

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按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獲取最新資料的功能實現圖

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

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟VS2005,建立一個網站,命名為“CacheDependencySample”。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在網站根目錄下,新增一個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>

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟預設生成的Default.aspx頁,新增一個GridView控制元件和一個按鈕控制元件。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按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”。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     切換回設計檢視,再雙擊按鈕控制元件,此時游標停靠在按鈕的Click事件內。在此事件內書寫程式碼,判斷XML檔案的資料是否已更新,如果已更新則給出提示,並重新新增快取依賴項,否則直接從快取讀取GridView控制元件的資料。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在“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檔案發生改變後,其實快取依賴和快取項都被移除了,必須重新定義。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按Ctrl+S組合鍵儲存程式碼的修改。再按F5鍵執行程式,單擊“獲取資料”按鈕,GridView就會顯示XML檔案的內容。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     程式執行正常後,在後臺修改XML檔案的內容,然後再單擊“獲取資料”按鈕,則出現更改資料的提示,同時GridView顯示了新的內容。圖16-4和圖16-5是資料更改前和更改後的效果對比。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師    cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師

圖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:判斷資料庫快取依賴是否發生了變化。

—  Dispose:釋放快取依賴所佔用的資源。

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

在下節要介紹的使用例項中,將不再使用程式碼的方式實現快取依賴,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency引數實現資料庫表的快取。如果要使用程式設計的方式實現此功能,可參考CacheDependency類的例項。

16.4.4  使用SqlCacheDependency類的操作流程

要實現資料庫快取依賴,必須結合資料庫的操作。在使用資料庫快取依賴前,必須進行5步操作。詳細流程如圖16-6所示。

只有具備了上述條件,才可以正常地使用資料庫快取依賴。下一節將結合這5步操作演示如何實現資料庫的快取依賴。

建立資料庫連結

 

圖16-6  使用資料庫快取依賴的流程

16.4.5  典型應用:獲取資料庫表最新資料的例項

本例要實現的功能是當資料庫的內容發生變化時,儲存在快取中的資料項被更新。具體演示的步驟如下所述。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在資料庫中建立資料庫“testCache”。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在資料庫“testCache”中新增表“CacheTable”,其資訊如表16-3所示。

表16-3  CacheTable表的資訊

字  段  名

欄位型別

說    明

id

int

自增長資料標識

Name

nvarchar(20)

書名

bookPublish

nvarchar(50)

出版社

Price

decimal(6,2)

書的價格

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     為資料庫啟用快取通知。開啟“開始”|“所有程式”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”選單命令。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     輸入如下命令,其中“-ed”和“-et”分別代表啟用快取依賴資料庫和啟用快取資料表。

aspnet_regsql.exe -S  CGJ-57F90CCA64C\SQLEXPRESS -E -ed -d  testCache -et -t  CacheTable

注意如果使用的資料庫驗證方式是“SQL Server身份驗證”,則需要使用如下的啟動命令:

aspnet_regsql.exe -S  CGJ-57F90CCA64C\SQLEXPRESS  -U <Username> -P <Password> -ed -d testCache -et -t CacheTable

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師   輸入命令後,按回車鍵。如果執行成功,效果如圖16-7所示。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟VS2005,新建一個網站,命名為“SqlCacheDependency”。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按F5鍵執行程式,主要目的是生成一個預設的Web.Config檔案。然後關閉執行的程式。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在Web.config中配置資料庫連線字串,程式碼如下:

     <connectionStrings>

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

Data.SqlClient"/>

     </connectionStrings>

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師

圖16-7  啟用資料庫快取依賴成功的提示圖

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在“system.web”節點內,新增資料庫快取依賴的配置,詳細程式碼如下所示。注意配置中的“connectionStringName”屬性,要與前面建立的資料庫連線字串的名字相對應。

<caching>

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

         <databases>

              <add name="testCache"

                 connectionStringName="TestCacheConnectionString"

                 pollTime = "1000"      />

         </databases>

     </sqlCacheDependency>

</caching>

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按Ctrl+S組合鍵儲存配置檔案的更改。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟預設生成的Default.aspx頁,在設計檢視中新增一個GridView控制元件,用來顯示從資料庫獲取的資料。再新增一個Literal控制元件,主要用來顯示時間,通過時間判斷顯示的是否是快取中的資料。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     為GridView配置資料來源。單擊其任務列表,在“選擇資料來源”下拉框中,單擊“新建資料來源”命令,開啟資料來源的配置嚮導。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     在開啟的資料來源型別視窗中,選擇“資料庫”,單擊“確定”按鈕,出現選擇連線字串視窗,通過下拉列表選擇剛剛建立的“TestCacheConnectionString”連線串。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     單擊“下一步”按鈕,出現“配置Select語句”對話方塊,在“列”列表框中選擇“*”,表示選中所有列。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     單擊“下一步”按鈕出現測試查詢對話方塊,然後單擊“完成”按鈕。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按F7鍵切換到到程式碼檢視,在“Page_Load”事件中新增如下程式碼(主要是顯示當前的時間,用來判斷是否是快取資料):

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

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按Ctrl+S組合鍵儲存當前頁的設計,再按F5鍵執行程式。當重新整理頁面時,可以看到時間是不斷變化的,這說明資料並沒有來自快取。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     開啟Default.aspx頁,在原始碼檢視的“<@page ”行下面,新增如下所示程式碼。其中使用的引數“SqlDependency”,就是用來新增資料庫快取依賴的。

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

注意:Duration引數是表示快取的過期時間,單位是毫秒。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     按F5鍵執行程式,此時再重新整理頁面,發現當前的時間已經不再變化,因為整個頁的資料被快取了起來。

cache轉,最下面有cache與Session的區別介紹 - x8671r - 半獸人-一個菜鳥程式設計師     此時修改資料庫的內容,然後重新整理執行著的頁面,可以發現,資料跟著發生了變化。這就是資料庫快取依賴的體現。當資料庫內容更新時,不管快取的時間有沒有到,快取的內容都會被更新。

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時代的到來打下堅實的基礎。

相關推薦

快取cachesession區別

快取主要是為了提高資料的讀取速度。因為伺服器和應用客戶端之間存在著流量的瓶頸,所以讀取大容量資料時,使用快取來直接為客戶端服務,可以減少客戶端與伺服器端的資料互動,從而大大提高程式的效能。 本章從快取所在的名稱空間“System.Web.Caching”開始,詳細介紹框架提

JQ的物件dom的物件.eq()[]的區別

首先我們假設一個html中有以下元素: <div class="sel"></a> <div class="sel"></a> <div class="sel"></a>   使用JQ選擇元素的時

JS事件流W3CIE區別

一、JS事件的3個階段:捕獲、目標、冒泡,低版本IE不支援捕獲階段; 二、在瀏覽器解析事件的時候,有兩種觸發方式:一種叫做Bubbling(冒泡),另外一種叫做Capturing(捕獲)。 冒泡的方式效果就是當一個DOM元素的某事件例如click事件

Django筆記cookiesession的運用及區別

目錄 怎麼使用 怎樣使用 cookie 瀏覽器端的會話技術 怎麼使用 設定cookie response = HttpResponse() # 設定cookies #response.set_cookie(key,value[,max_a

讀懂作業系統之虛擬記憶體TLB快取cache關係篇

前言 前面我們講到通過TLB快取頁表加快地址翻譯,通過上一節快取原理的講解為本節做鋪墊引入TLB和快取的關係,同時我們來完整梳理下從CPU產生虛擬地址最終對映為實體地址獲取資料的整個過程是怎樣的,若有錯誤之處,還請批評指正。 TLB和快取序列訪問(Serial TLB & Cache Access)

python-連線MySQLmysql.connectorMySQLdb區別

  1.安裝mysql-connector 命令    pip install mysql-connector  import mysql.connector cnx = mysql.connector.connect(user='roo

PHP全域性變數SESSION 漏洞global session

先看這一段簡單的程式碼 <?php session_start();$_SESSION[‘isadmin’]=’yes’;$isadmin=’no’;echo $_SESSION[‘isadmin’];?> 當php.ini裡配置register_globals = Off 時, 沒任何問題, 輸

PHP全局變量SESSION 漏洞global session

自動創建 rac variables 自動 ech array req 導入 isa 先看這一段簡單的代碼 <?php session_start();$_SESSION[‘isadmin’]=’yes’;$isad

spring +ehcache 註解方式配置快取springgooglecode 的ehcache 兩種

前言:有人知道 -spring  +ehcache 註解方式和mybatis +ehcache的區別嗎? (①spring的ehcache與②googlecode 的ehcache)//這是兩種配置,都能實現ehcache快取。綠色表示1需要,藍色表示2需要 黑色表示都需要 googl

SpringMVC框架11.4 SpringMVC Struts區別

SpringMVC與 Struts區別 SpringMVC是通過方法的形參接收引數,可以以單例方式 使用,建議使用單例; Struts通過成員變數接收引數,在使用時 必須以多例方式 使用;   SpringMVC是 基於方法 開發(以方法為單位),一個請求的方法對應一個 H

機房收費系統之操作員記錄、正在值班人員記錄關閉視窗判斷事件,MsgBox返回值,QueryunloadUnload區別

      機房收費系統的操作員記錄與正在值班人員記錄的窗體比較簡單,思路也差不多,在這裡就彙總在一起進行總結。 一、流程圖 ①操作員工作記錄窗體流程圖 ②正在值班人員窗體流程圖 二、查詢集 ①MsgBox的返回值有哪些,如何獲取返回值?  

Flask ~~“一見鍾情之初體驗”cookiesession簡單使用

                                            &

深入淺出之 TCP協議三次握手四次揮手、超時重發、流量控制、擁塞控制、UDP區別

TCP/IP 中有兩個具有代表性的傳輸層協議,分別是TCP、UDP。TCP提供可靠的通訊傳輸,而UDP則常被用於讓廣播和細節控制交給應用的通訊傳輸。 要知道TCP為了這簡單描述“可靠的通訊傳輸”背後所做的努力,你會深感佩服其強大性。TCP的特徵:序列化+確認應

三個等號和兩個等號的區別“===”“==”的區別

1.===:三個等號我們稱為等同符,當等號兩邊的值為相同型別的時候,直接比較等號兩邊的值,值相同則返回true,若等號兩邊的值型別不同時直接返回false。      例:100===“100”   //返回false               abc===“abc”  

interface abstract class介面 抽象類的特點以及區別,以及應用場景

一、抽象類(abstract) 1、抽象類不能被例項化,如果例項化就會報錯,編譯無法通過。只有抽象類的非抽象子類可以建立物件。 2、抽象類中不一定含有抽象方法,但是有抽象方法的類一定是抽象類。 3、抽象類中的抽象方法只能宣告,不包含方法體,就是不會給出方法的具體實現

SpringBoot中快速體驗快取Cache使用

一、基本專案搭建 測試專案是基於SpringBoot+Mybatis+Maven; 1、搭建基本環境,具體步驟如下: (1)、新建資料庫,匯入資料庫檔案,創建出department和employee表; (2)、建立SpringBoot-cache工程,選擇具體模組,如下

搜尋引擎中快取cache用到的雜湊hash演算法

前一段查看了關於雜湊的各種演算法,發現流傳最廣的還算偉大的暴雪(dota愛好者)工程師得到的一種演算法,有很多部落格中都有對其的介紹,我在此就不多廢話了。 雖說是借鑑,也只是一小部分的抄襲。不知道是否冒犯了暴雪的版權。 我修改成了我需要的功能,我的目標是對6w資料進行雜湊計

javaweb面試總結四、分散式事務、CAP原理和BASE思想、JDBC事務和JTA事務的區別、2PCTCC區別

CAP原理和BASE思想: http://www.jdon.com/37625分散式事務如何處理?解決方案有很多種!比如事務補償機制:即在事務鏈中的任何一個正向事務操作,都必須存在一個完全符合回滾規則的可逆事務。或者利用訊息系統實現最終一致性;----------------

hibernate的list集合對映set區別

ref:http://blog.csdn.net/longyuan20102011/article/details/7722693 主要區別 set沒有順序,也不允許重複。可以級聯儲存 list可以允許重複,有次序。但沒有級聯一說,所以必須每個物件各自儲存各自的 depa

強制瀏覽器使用本地快取cache-control/expires,不要和伺服器通訊?

nginx 可以這樣配置。nginx.conf 中 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires 30d;}location ~ .*\.(js|css)?${expires 1h;}