五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > ASP.NET緩存

ASP.NET緩存

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):335    更新時(shí)間:2009-11-09 22:40   參與評(píng)論

 

介紹

緩存是在內(nèi)存存儲(chǔ)數(shù)據(jù)的一項(xiàng)技術(shù),也是ASP.NET中提供的重要特性之一。例如你可以在復(fù)雜查詢(xún)的時(shí)候緩存數(shù)據(jù),這樣后來(lái)的請(qǐng)求就不需要從數(shù)據(jù)庫(kù)中取數(shù)據(jù),而是直接從緩存中獲取。通過(guò)使用緩存可以提高應(yīng)用程序的性能。

主要有兩種類(lèi)型的緩存:

1.輸出緩存Output caching
2.數(shù)據(jù)緩存Data caching

1. 輸出緩存(Output Caching)

使用輸出緩存,你可以緩存最后輸出的HTML頁(yè)面,當(dāng)相同的頁(yè)面再次請(qǐng)求的時(shí)候,ASP.NET不會(huì)再執(zhí)行頁(yè)面的生命周期和相關(guān)代碼而是直接使用緩存的頁(yè)面,語(yǔ)法如下:

<%@ OutputCache Duration=”60” VaryByParam=”None”  %> 

Duration 屬性設(shè)置頁(yè)面將被緩存60妙。任何的用戶(hù)請(qǐng)求都會(huì)被緩存,在緩沖的60秒內(nèi)相同的請(qǐng)求都會(huì)直接使用緩存的頁(yè)面。當(dāng)緩存過(guò)期后ASP.NET會(huì)再次執(zhí)行頁(yè)面代碼并且為下一個(gè)60秒創(chuàng)建一個(gè)新的HTML緩存。

  <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
        CodeFile="OutputCachingTest.aspx.cs" Inherits="OutputCachingTest" Title="Untitled Page" %>
 <%@ OutputCache Duration="20" VaryByParam="None" %>
 <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
   <div class="title">Output Cache</div>
   Date: <asp:Label ID="lblDate" runat="server" Text="" />
   Time: <asp:Label ID="lblTime" runat="server" Text="" />       
 </asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
   lblDate.Text = DateTime.Now.ToShortDateString();
   lblTime.Text = DateTime.Now.ToLongTimeString(); 
} 

在這個(gè)例子中頁(yè)面將被緩存20秒。

通過(guò)查詢(xún)字符串緩存(Cache by Query String )

在實(shí)際應(yīng)用中頁(yè)面往往會(huì)根據(jù)一些參數(shù)動(dòng)態(tài)的改變頁(yè)面的內(nèi)容。如果你的頁(yè)面是通過(guò)查詢(xún)字符串來(lái)獲取信息的,你可以根據(jù)查詢(xún)字符串很容易的緩存頁(yè)面的不同拷貝。VarByParam=”None”指定ASP.NET只存儲(chǔ)緩存頁(yè)面的一個(gè)拷貝。VarByParam=”*” 指定ASP.NET根據(jù)不同的查詢(xún)字符串存儲(chǔ)不同的緩存頁(yè)面。

<%@ OutputCache Duration="60" VaryByParam="*" %>

<div align="right">
   <a href="OutputCachingTest2.aspx">No Query String</a> | 
   <a href="OutputCachingTest2.aspx?id=1">ID 1</a> | 
   <a href="OutputCachingTest2.aspx?id=2">ID 2</a> | 
   <a href="OutputCachingTest2.aspx?id=3">ID 3</a> |
   <a href="OutputCachingTest2.aspx?id=3&langid=1">ID 3</a>
</div> 


上面的例子中,在查詢(xún)字符串中傳了不同的ID.ASP.NET為每一個(gè)ID都存儲(chǔ)了單獨(dú)的緩存頁(yè)面。這種方式會(huì)有一些問(wèn)題就是當(dāng)查詢(xún)字符串范圍很廣的時(shí)候。
這個(gè)時(shí)候我們可以在VarByParam 屬性中指定重要的查詢(xún)字符串變量的名字,如下:

<%@OutputCacheDuration="60"VaryByParam="id;langid"%>

這樣,ASP.NET可以根據(jù)id” or “langid”來(lái)緩存不同的緩存版本。

自定義緩存(Custom Caching)

你也可以創(chuàng)建自定義的程序來(lái)緩存頁(yè)面。ASP.NET提供了一種很便捷的方式來(lái)創(chuàng)建自定義緩存,使用VarByCustom屬性指定自定義緩存類(lèi)型的名字。

%@OutputCacheDuration="20"VaryByParam="None"VaryByCustom="browser"%

你還要?jiǎng)?chuàng)建為緩存生成自定義字符串的方法,如下:

public override stringGetVaryByCustomString(HttpContext context, stringcustom)
{
    if(custom == "browser")
    {
       returncontext.Request.Browser.Browser +
              context.Request.Browser.MajorVersion;
    }
    else
  
{
       return base.GetVaryByCustomString(context, custom);
    }
}

這個(gè)方法必須寫(xiě)在global.asax文件中。ASP.NET使用該方法返回的字符串來(lái)實(shí)現(xiàn)緩存,如果這個(gè)方法在不同的請(qǐng)求中返回相同的字符串,ASP.NET就會(huì)使用緩存的頁(yè)面,否則就會(huì)生成新的緩存版本。

上面的例子中GetVaryByCustomString()方法根據(jù)瀏覽器的名字創(chuàng)建緩存字符串,ASP.NET會(huì)根據(jù)不同的瀏覽器請(qǐng)求創(chuàng)建不同版本的緩存。

控件緩存(Control Cache )

上面的緩存技術(shù)可以讓你很容易的緩存整個(gè)頁(yè)面,如果要緩存指定控件的內(nèi)容,可以通過(guò)指定VaryByControl 屬性來(lái)完成。

<%@OutputCacheDuration="20"VaryByControl="MyControl_1"%>

上面代碼ASP.NET將會(huì)緩存MyControl_1控件20分鐘。如果要根據(jù)一些屬性值來(lái)緩存控件只需要將OutPutCache指令加入*.ascx頁(yè)面。 

<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControl.ascx.cs"Inherits="Controls_MyControl"%>
<%
@OutputCacheDuration="20"VaryByControl="EmployeeID"%>
......
......

VaryByControl=”EmployeeID”告訴ASP.NET根據(jù)控件中聲明的EmployeeID屬性來(lái)創(chuàng)建不同版本的緩存。

.ascx.cs 文件加入EmplyeeID屬性為ASP.NET 緩存使用。

private int_employeeID;

public intEmployeeID
{
   get{ return_employeeID; }
   set{ _employeeID = value; }
}

protected voidPage_Load(objectsender, EventArgs e)
{
   lblDate.Text = DateTime.Now.ToShortDateString();
   lblTime.Text = DateTime.Now.ToLongTimeString();

   lblEmployeeID.Text = EmployeeID.ToString();

}

在頁(yè)面中增加控件并且設(shè)置 EmployeeID.

<%@RegisterSrc="Controls/MyControl.ascx"TagName="MyControl"TagPrefix="uc1"%>
<asp:ContentID="Content1"ContentPlaceHolderID="ContentPlaceHolder1"runat="Server">
    <
divalign="center">
        <
uc1:MyControlID="MyControl1"runat="server"EmployeeID="1"></uc1:MyControl>
    </
div>
</
asp:Content>

緩存配置文件(Cache Profile )

web.config可以配置緩存相關(guān)的設(shè)置,

<system.web>
  <
caching>
    <
outputCacheSettings>
      <
outputCacheProfiles>
     <
addname="ProductItemCacheProfile" duration="60"/>
   </
outputCacheProfiles>
</
outputCacheSettings>
   </
caching>
</
system.web>

你可以通過(guò)設(shè)置 CacheProfile=”ProfileName” 屬性 來(lái)使用上面的配置:

%@OutputCacheCacheProfile="ProductItemCacheProfile"VaryByParam="None"%

2. 數(shù)據(jù)緩存(Data Caching)

ASP.NET還提供了另一種靈活的緩存類(lèi)型:數(shù)據(jù)緩存。你可以將一些耗費(fèi)時(shí)間的條目加入到一個(gè)對(duì)象緩存集合中,以鍵值的方式存儲(chǔ)。

Cache["Name"] = data;

我們可以通過(guò)使用Cache.Insert()方法來(lái)設(shè)置緩存的過(guò)期,優(yōu)先級(jí),依賴(lài)項(xiàng)等。

date1 = DateTime.Now;
Cache.Insert("Date1", date1, null, DateTime.Now.AddSeconds(20), TimeSpan.Zero);

ASP.NET允許你設(shè)置一個(gè)絕對(duì)過(guò)期時(shí)間或滑動(dòng)過(guò)期時(shí)間,但不能同時(shí)使用。

緩存依賴(lài)項(xiàng)Cache dependency

緩存依賴(lài)項(xiàng)使緩存依賴(lài)于其他資源,當(dāng)依賴(lài)項(xiàng)更改時(shí),緩存條目項(xiàng)將自動(dòng)從緩存中移除。緩存依賴(lài)項(xiàng)可以是應(yīng)用程序的 Cache 中的文件、目錄或與其他對(duì)象的鍵。如果文件或目錄更改,緩存就會(huì)過(guò)期。

date2 = DateTime.Now;

string[] cacheKeys = { "Date1"};
CacheDependency cacheDepn = newCacheDependency(null, cacheKeys);
Cache.Insert("Date2", date2, cacheDepn);

上面的例子“Date2”緩存對(duì)象依賴(lài)“Date1”緩存條目,當(dāng) “Date1” 對(duì)象過(guò)期后“Date2” 將會(huì)自動(dòng)過(guò)期。CacheDependency(null, cacheKeys)中的第一個(gè)參數(shù)為空是由于我們只監(jiān)視緩存鍵的更改情況。

回調(diào)函數(shù)和緩存優(yōu)先級(jí)(Callback Method and Cache Priority)

ASP.NET允許我們寫(xiě)一個(gè)回調(diào)函數(shù),當(dāng)緩存條目從緩存中移除的時(shí)候觸發(fā)。還可以設(shè)置緩存條目的優(yōu)先級(jí)。

protected void Page_Load(object sender, EventArgs e)
{
  DateTime? date1 = (DateTime?)Cache["Date1"];
  if (!date1.HasValue) // date1 == null
  {
    date1 = DateTime.Now;
    Cache.Insert("Date1", date1, null, DateTime.Now.AddSeconds(20), TimeSpan.Zero, 
                 CacheItemPriority.Default, new CacheItemRemovedCallback(CachedItemRemoveCallBack));
  }

  DateTime? date2 = (DateTime?)Cache["Date2"];
  if (!date2.HasValue) // date2 == null
  {
    date2 = DateTime.Now;
    Cache.Insert("Date2", date2, null, DateTime.Now.AddSeconds(40), TimeSpan.Zero, 
                 CacheItemPriority.Default, new CacheItemRemovedCallback(CachedItemRemoveCallBack));
  }

  // Set values in labels
  lblDate.Text = date1.Value.ToShortDateString();
  lblTime.Text = date1.Value.ToLongTimeString();

  lblDate1.Text = date2.Value.ToShortDateString();
  lblTime1.Text = date2.Value.ToLongTimeString();

}
   
private void CachedItemRemoveCallBack(string key, object value, CacheItemRemovedReason reason)
{
  if (key == "Date1" || key == "Date2")
  { 
     Cache.Remove("Date1");
     Cache.Remove("Date2");
  }
}

例子中創(chuàng)建了“Date1” 和 “Date2”緩存。“Date1” 在20秒后過(guò)期“Date2”為40秒。但是由于我們注冊(cè)了移除的回調(diào)函數(shù),當(dāng)“Date1” 或 “Date2”其中一個(gè)過(guò)期都會(huì)執(zhí)行CachedItemRemoveCallBack 方法,在這個(gè)方法中移除了兩個(gè)緩存條目,ASP.NET還提供了處理緩存條目更新時(shí)的回調(diào)函數(shù)CacheItemUpdateCallback 。

如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (335人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱(chēng):
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢(xún)

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)