W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵(lì)
緩存是一種將經(jīng)常使用的數(shù)據(jù)/信息存儲在內(nèi)存中的技術(shù),這樣,下次需要相同的數(shù)據(jù)/信息時(shí),可以直接從內(nèi)存檢索,而不是再從應(yīng)用程序中生成。
緩存在用于提高 ASP 性能方面是非常重要的,因?yàn)?ASP 的頁面和控件是都動態(tài)生成的。這對于交互相關(guān)的數(shù)據(jù)是極其重要的,因?yàn)轫憫?yīng)時(shí)間是很寶貴的。
在需要快速訪問的媒體,如計(jì)算機(jī)的隨機(jī)存取存儲器,緩存放置了被頻繁使用的數(shù)據(jù)。ASP 的運(yùn)行時(shí)間包含一個(gè)叫做緩存的 CLR 對象的鍵值對。它位于應(yīng)用程序內(nèi),并且通過 HttpContext 和 System.Web.UI.Page 可用。
在某些方面,緩存和存儲狀態(tài)對象有相似之處。然而,狀態(tài)對象的存儲信息是確定的,比如,你可以計(jì)算存儲在狀態(tài)對象的數(shù)據(jù),但是緩存的數(shù)據(jù)是不確定的。
在下列情況里,數(shù)據(jù)是不可用的:
您可以使用一個(gè)索引器在緩存中訪問項(xiàng)目,并且有可能控制緩存中對象的生命周期和設(shè)置緩存的對象及其物理資源之間的聯(lián)系。
ASP提供如下幾種不同類型的緩存:
在本教程中,我們將考慮輸出緩存,數(shù)據(jù)緩存和對象緩存。
呈現(xiàn)一個(gè)頁面可能涉及一些復(fù)雜的過程,如,數(shù)據(jù)庫訪問,呈現(xiàn)復(fù)雜的控件等。輸出緩存允許通過在內(nèi)存中緩存數(shù)據(jù),而繞過往返服務(wù)器。甚至可以緩存整個(gè)頁面。
OutputCache 指令負(fù)責(zé)輸出緩存。它啟用輸出緩存,并對其行為提供一定程度的控制。
OutputCache 指令的語法:
<%@ OutputCache Duration="15" VaryByParam="None" %>
把這個(gè)指令放在頁面指令下。這告訴環(huán)境需要緩存頁面,持續(xù) 15 秒。以下頁面加載事件處理程序?qū)椭_認(rèn)頁面是否已被緩存完畢。
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(10000);
Response.Write("This page was generated and cache at:" +
DateTime.Now.ToString());
}
Thread.Sleep()方法使特定時(shí)間內(nèi)的進(jìn)程停止。在這個(gè)例子中,線程停止了 10 秒鐘,因此,當(dāng)頁面第一次下載時(shí),需要花費(fèi) 10 秒鐘的時(shí)間。然而,下次刷新頁面的時(shí)候,就不會花費(fèi)時(shí)間了,因?yàn)檫@個(gè)頁面已經(jīng)從緩存中獲取了,不要再下載。
當(dāng)幫助控制輸出緩存的行為 OutputCache 指令有以下特性:
屬性 | 值 | 描述 |
---|---|---|
DiskCacheable | true/false | 描述輸出是否可以寫入帶有緩存的磁盤。 |
NoStore | true/false | 描述 "no store" 緩存頭部是否被發(fā)送。 |
CacheProfile | 字符串名 | 存儲在 web.config 中的緩存配置文件名字。 |
VaryByParam | None * 參數(shù)名 | GET 請求中使用分號分隔的字符串值或者是 POST 請求中的變量值。 |
VaryByHeader | * 頭文件名 | 可能是由客戶端提交的用分號分隔的指定頭的字符串。 |
VaryByCustom | 瀏覽器 自定義字符串 | 通知 ASP.NET 通過瀏覽器名字版本或者客戶端字符串改變輸出緩存。 |
Location | 任何 客戶端 下載流 服務(wù)器 None | 任何:頁面可能緩存在任何位置 客戶端:緩存內(nèi)容包含在瀏覽器中 下載流:緩存內(nèi)容保存在下載流和服務(wù)器中 服務(wù)器:緩存僅保存在服務(wù)器之中 None:不允許緩存。 |
Duration | 數(shù)字 | 被緩存頁面或者操作的秒數(shù)。 |
讓我們?yōu)榍懊娴氖纠砑右粋€(gè)文本框和一個(gè)按鈕,并添加這個(gè)按鈕的事件處理程序。
protected void btnmagic_Click(object sender, EventArgs e)
{
Response.Write("<br><br>");
Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}
改變 OutputCache 指令:
<%@ OutputCache Duration="60" VaryByParam="txtname" %>
程序執(zhí)行的時(shí)候,ASP 在文本框中依據(jù)名字緩存頁面。
數(shù)據(jù)緩存的主要方面是數(shù)據(jù)源控件緩存。我們已經(jīng)討論了數(shù)據(jù)源控件代表一個(gè)數(shù)據(jù)源中的數(shù)據(jù),如數(shù)據(jù)庫或 XML 文件。這些控件從抽象類 DataSourceControl 中派生,并有以下繼承屬性以實(shí)現(xiàn)緩存:
為了演示數(shù)據(jù)緩存,我們創(chuàng)建一個(gè)新的網(wǎng)站,在上面添加一個(gè)新的網(wǎng)絡(luò)表單。在數(shù)據(jù)庫中添加一個(gè)連接數(shù)據(jù)訪問教程的 SqlDataSource 控件。
在這個(gè)實(shí)例中,我們給頁面添加一個(gè)標(biāo)簽,這個(gè)標(biāo)簽可以顯示頁面的回應(yīng)時(shí)間。
<asp:Label ID="lbltime" runat="server"></asp:Label>
除了這個(gè)標(biāo)簽,整個(gè)頁面和數(shù)據(jù)訪問教程是一樣的。為這個(gè)頁面添加一個(gè)事件處理器,來下載時(shí)間。
protected void Page_Load(object sender, EventArgs e)
{
lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}
設(shè)計(jì)的頁面應(yīng)該是如下這個(gè)樣子的:
當(dāng)你第一次執(zhí)行頁面時(shí),并沒有發(fā)生什么不同。標(biāo)簽顯示,每次刷新頁面,頁面會重新加載,而且在標(biāo)簽上會顯示時(shí)間的變化。
接下來,把數(shù)據(jù)源控件的 EnableCaching 的屬性設(shè)置為“真”,將 Cacheduration 屬性設(shè)置為 “60”。它將實(shí)現(xiàn)緩存,緩存將每隔 60 秒到期。
每一次刷新,時(shí)間戳都會變化。但如果你在 60 秒之內(nèi)改變表中的數(shù)據(jù),在緩存到期之前將不會顯示。
<asp:SqlDataSource ID = "SqlDataSource1" runat = "server"
ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>"
ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>"
SelectCommand = "SELECT * FROM [DotNetReferences]"
EnableCaching = "true" CacheDuration = "60">
</asp:SqlDataSource>
對象緩存比其他緩存技術(shù)提供了更大的靈活性。你可以利用對象緩存在緩存中放置任何對象。對象也可以是任意類型的 — 數(shù)據(jù)類型,網(wǎng)絡(luò)控件,類,數(shù)據(jù)設(shè)置對象等等。僅僅需要給這些項(xiàng)目分配一個(gè)值名,它們就可以被添加到緩存中,就像下面展示的這樣:
Cache["key"] = item;
為了在緩存中插入對象, ASP 提供了 Insert() 方法。這種方法有四種重載版本。我們來看一下:
重載 | 描述 |
---|---|
Cache.Insert((key, value); | 以鍵值對的方式插入緩存,優(yōu)先權(quán)和生命周期為默認(rèn) 。 |
Cache.Insert(key, value, dependencies); | 以鍵值對的方式插入緩存,優(yōu)先權(quán)和生命周期為默認(rèn),和鏈接到其他文件或內(nèi)容的緩存依賴,這樣緩存修改就不再還有限的了。 |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | 指出上述配置的有效期。 |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | 與配置一起也允許設(shè)置緩存內(nèi)容的優(yōu)先權(quán)并委派,指出一種方法來調(diào)用當(dāng)一個(gè)對象移除時(shí)。 |
動態(tài)生命周期使用于移除一個(gè)不作用于任何一個(gè)指定的時(shí)間跨度的緩存項(xiàng)。下面代碼段用來保存一個(gè)具有 10 分鐘滑動生命周期的無依賴的緩存項(xiàng):
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
僅僅使用一個(gè)按鈕和一個(gè)標(biāo)簽創(chuàng)建一個(gè)頁面。在頁面加載事件中寫入如下代碼:
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
{
lblinfo.Text += "Page Posted Back.<br/>";
}
else
{
lblinfo.Text += "page Created.<br/>";
}
if (Cache["testitem"] == null)
{
lblinfo.Text += "Creating test item.<br/>";
DateTime testItem = DateTime.Now;
lblinfo.Text += "Storing test item in cache ";
lblinfo.Text += "for 30 seconds.<br/>";
Cache.Insert("testitem", testItem, null,
DateTime.Now.AddSeconds(30), TimeSpan.Zero);
}
else
{
lblinfo.Text += "Retrieving test item.<br/>";
DateTime testItem = (DateTime)Cache["testitem"];
lblinfo.Text += "Test item is: " + testItem.ToString();
lblinfo.Text += "<br/>";
}
lblinfo.Text += "<br/>";
}
當(dāng)頁面第一次加載時(shí),會顯示:
Page Created.
Creating test item.
Storing test item in cache for 30 seconds.
如果你在 30 秒鐘內(nèi)再次點(diǎn)擊按鈕,雖然頁面被刪除了,但是標(biāo)簽控件會從緩存中得到信息,如下所示:
Page Posted Back.
Retrieving test item.
Test item is: 14-07-2010 01:25:04
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: