Web緩存技術

本章導讀

緩存主要是為了提高數據的讀取速度。因為服務器和應用客戶端之間存在著流量的瓶頸,所以讀取大容量數據時,使用緩存來直接為客戶端服務,可以減少客戶端與服務器端的數據交互,從而大大提高程序的性能。

本章從緩存所在的命名空間“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對象中。

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

??在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+>

轉載于:https://www.cnblogs.com/mq0036/p/4031223.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神武4手游服務器維護,神武4手游勢不可擋開服時間表_神武4手游新區開服預告_第一手游網手游開服表...

2020-06-1910:00新服天涯刀客已經開服2020-06-0510:00新服飛仙摘星已經開服2020-05-2910:00新服踏雪無痕已經開服2020-05-2210:00新服因緣際會已經開服2020-05-1910:00新服龍的傳人已經開服2020-05-1510:00新服鸞鳳和鳴已經開服2020-05-1211:40新服其疾如風已經開服2020-05-081…

BZOJ 4066 簡單題 ——KD-Tree套替罪羊樹

【題目分析】 直接x,y二維輪番劃分&#xff0c;暴力即可。 套上替罪羊&#xff0c;打碎重構&#xff0c;對于時間復雜度有了保證。 寫起來好麻煩&#xff0c;重構的技巧很棒&#xff01; 【代碼】 #include <cstdio> #include <cstring> #include <iostream>…

【HTML5初探之繪制圖像(上)】看我canvas元素引領下一代web頁面

弧度一塊可能有誤&#xff0c;需要再研究 導航 【初探HTML5之使用新標簽布局】用html5布局我的博客頁&#xff01; 【HTML5初探之form標簽】解放表單驗證、增加文件上傳、集成拖放 【HTML5初探之繪制圖像&#xff08;上&#xff09;】看我canvas元素引領下一代web頁面 【HTML5初…

或運算

邏輯或 ||int i, j, k;i 0x15;j 0x41;k i || j;反匯編代碼如下:MOV DWORD PTR SS:[EBP-4], 15MOV DWORD PTR SS:[EBP-C], 41CMP DWORD PTR SS:[EBP-4], 0JNZ SHORT asm_OR.00401029CMP DWORD PTR SS:[EBP-C], 0JNZ SHORT asm_OR.00401029MOV DWORD PTR SS:[EBP-10], 0JMP SH…

構造方法的調用順序和成員變量的初始化時機以及動態綁定

構造方法的調用順序&#xff1a;子類構造器中&#xff0c;JVM會自動的先調用父類的構造方法&#xff0c;然后再執行子類構造方法。在JVM自動調用父類構造方法的時候&#xff0c;會完成父類中擁有的成員變量的值的初始化操作&#xff0c;此時子類的成員變量并未初始化&#xff0…

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函數參數傳遞 strings, tuples, 和numbers是不可更改的對象&#xff0c;而list,dict等則是可以修改的對象 2 Python中的元類(metaclass) 3 staticmethod和classmethod python 三個方法&#xff0c;靜態方法&#xf…

突然不能 ip訪問服務器文件夾,用友U8 工作站連接不到服務器,ping IP及服務器名都正常,訪問服務器共享文件夾也正常...

用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符問題原因:錯誤原因見下面解決方案中的分析。解決方法:在查詢存貨明細帳和現存量09倉庫存貨510241數量為123&#xff0c;但在添采購入庫單紅字時卻…

rocketmq 消息 自定義_RocketMQ消息軌跡-設計篇

RocketMQ 消息軌跡主要包含兩篇文章&#xff1a;設計篇與源碼分析篇&#xff0c;本節將詳細介紹RocketMQ消息軌跡-設計相關。RocketMQ消息軌跡&#xff0c;主要跟蹤消息發送、消息消費的軌跡&#xff0c;即詳細記錄消息各個處理環節的日志&#xff0c;從設計上至少需要解決如下…

再次獻給那些心軟的人!!!

上次那篇日志朋友看了評論說&#xff1a;別太悲觀……為那些壞人成為壞人才是最不值得的&#xff01;而且好人說要當壞人就只是說說而已&#xff0c;真碰到啥事&#xff0c;依舊會傻傻的幫……沒錯&#xff0c;我還是傻傻的幫了&#xff0c;最初會表現出一點不樂意&#xff0c;…

手機做服務器性能咋樣,服務器性能不足 怎樣才能逼出最強狀態

而且&#xff0c;服務器的節能不僅僅意味著節省了電費&#xff0c;其后續的散熱降溫等工作都可以得到更好的節約。同時&#xff0c;服務器的在長時間工作的情況下&#xff0c;保持較低溫度有利于降低其承載負荷&#xff0c;最大限度發揮其能力&#xff0c;保障服務器工作運行的…

ASP.NET跨頁面傳值技巧總結

1. 使用QueryString變量 QueryString是一種非常簡單的傳值方式&#xff0c;他可以將傳送的值顯示在瀏覽器的地址欄中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時&#xff0c;可以使用這個方法。但是對于傳遞數組或對象的話&#xff0c;就不能用這個方法了。下面…

RTMP協議中文翻譯(首發)(轉)

Adobe公司的實時消息傳輸協議 摘要 此備忘錄描述了 Adobe公司的實時消息傳輸協議(RTMP)&#xff0c;此協議從屬于應用層&#xff0c;被設計用來在適合的傳輸協議&#xff08;如TCP&#xff09;上復用和打包多媒體傳輸流&#xff08;如音頻、視頻和互動內容&#xff09;。 目錄 …

關卡 動畫 藍圖 運行_UE4入門之路(基礎藍圖篇):藍圖的制作

藍圖系統簡介藍圖系統是UE4中十分有代表性的一個特點&#xff0c;所謂藍圖就是一種可視化的腳本。該系統非常靈活且非常強大&#xff0c;因為它為設計人員提供了一般僅供程序員使用的所有概念及工具。 程序員能夠很方便的創建一個基礎系統&#xff0c;并交給策劃進一步在藍圖中…

overfitting(過度擬合)的概念

來自&#xff1a;http://blog.csdn.net/fengzhe0411/article/details/7165549 最近幾天在看模式識別方面的資料&#xff0c;多次遇到“overfitting”這個概念&#xff0c;最終覺得以下解釋比較容易接受&#xff0c;就拿出來分享下。 overfittingt是這樣一種現象&#xff1a;一個…

虛擬串口服務器zenetmanager,Avocent服務器/串口管理 KVM

MergePoint Unity交換機在單個設備中結合了 KVM over IP和串行控制臺管理技術。這項獨特的結合為IT管理員提供了用于訪問和控制服務器、網絡設備及其他數據中心和分支辦公室設備的完整遠程管理解決方案。MergePoint Unity交換機直接與物理KVM、USB和串行端口進行安全的遠程帶外…

KAFKA分布式消息系統

Kafka[1]是linkedin用于日志處理的分布式消息隊列&#xff0c;linkedin的日志數據容量大&#xff0c;但對可靠性要求不高&#xff0c;其日志數據主要包括用戶行為&#xff08;登錄、瀏覽、點擊、分享、喜歡&#xff09;以及系統運行日志&#xff08;CPU、內存、磁盤、網絡、系統…

jar打包 剔除第三方依賴以及它的依賴_面試官:為什么Spring Boot的jar可以直接運行?...

來源&#xff1a;Gormats Notesfangjian0423.github.io/2017/05/31/springboot-executable-jar/Spring Boot Loader抽象的一些類JarLauncher的執行過程關于自定義的類加載器LaunchedURLClassLoaderSpring Boot Loader的作用SpringBoot提供了一個插件spring-boot-maven-plugin用…

CQRS架構圖

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/darkness/blog/814243

SQLite中不支持的sql語法

今天很自然的在寫Sql語句的時候用了Top&#xff0c;一開始沒發現問題&#xff0c;因為我從數據庫讀出的值正好是0&#xff0c;而我習慣變量定義的時候也都賦值0&#xff0c;可是到我不要0的時候我就發現問題了。后來才知道&#xff0c;可愛的小sqlite竟然有不支持的sql語法。 看…

Analyzer普通用戶登錄不了[從網絡訪問此計算機]

問題&#xff1a; 最近客戶諾奇反映說Analyzer普通用戶登錄不了&#xff0c;但是發現管理員又可以登錄&#xff0c;幾經周折發現原來是系統的本地安全策略設置了不讓遠程使用本地賬戶密碼登錄系統導致。解決方案&#xff1a; 修改本地安全策略的“從遠程訪問此計算機”中的用戶…