自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET 2.0緩存技術(shù)探討

開發(fā) 后端
本文介紹通過緩存來提高網(wǎng)頁的執(zhí)行效率,包括ASP.NET Output Caching、Page Fragment Caching等內(nèi)容。希望大家能從中受益。

1.ASP.NET Output Caching

當(dāng)一個(gè)網(wǎng)頁頻繁被訪問的時(shí)候,我們可以通過把整個(gè)網(wǎng)頁緩存來提高執(zhí)行效率。這樣作的優(yōu)點(diǎn)是,當(dāng)用戶再次訪問這個(gè)網(wǎng)頁的時(shí)候,被格式化好的HTML會(huì)被直接送顯。

為什么會(huì)存在這種效果呢?我們通過ASP.NET的基本運(yùn)行機(jī)制來解釋這個(gè)問題。ASP.NET是一個(gè)動(dòng)態(tài)的服務(wù)器,當(dāng)用戶從客戶端提供一個(gè)請(qǐng)求的時(shí)候,那么服務(wù)端的IIS接受到請(qǐng)求,然后根據(jù)用戶的提示執(zhí)行相應(yīng)的代碼。執(zhí)行代碼之后生成一個(gè)結(jié)果。這個(gè)結(jié)果會(huì)被緩存成一個(gè)HTML放在Server端,然后通過響應(yīng)用戶的Request將這個(gè)HTML傳送到客戶端。在這之中我們發(fā)現(xiàn),很多時(shí)候,用戶的請(qǐng)求實(shí)際上并沒有多大的變化,可能請(qǐng)求的都是相同的內(nèi)容。這時(shí)候執(zhí)行一次代碼的成本就會(huì)相當(dāng)?shù)母?。既然我們已?jīng)生成了一個(gè)HTML,我們何必要在重新執(zhí)行一次代碼呢?我們直接把HTML送顯就可以了。

◆Output Cache是一項(xiàng)非常有效的增強(qiáng)訪問性能的技術(shù),由于IIS的一些特性,默認(rèn)情況下Output Cache是打開的,但是要對(duì)一些請(qǐng)求進(jìn)行緩存,還需要開發(fā)者進(jìn)行定制。

◆定制Output Caching

對(duì)于Output Caching的定制,我們有兩種方法,一種是基于底層的API技術(shù),一種是基于高層的@Output Caching,一旦Output Caching被定制過,那么這個(gè)網(wǎng)頁就會(huì)在第一次被訪問的時(shí)候生成cache,直到請(qǐng)求過期為止。

我們著重點(diǎn)是使用高層的@Output Caching標(biāo)簽來設(shè)置,因?yàn)锳PI技術(shù)的編程難度比較大,和ASP.NET快速編程理念不相符。

◆代碼示例:通過使用Output Cache定義一個(gè)緩存頁,顯示當(dāng)前時(shí)間,大家可以看到,當(dāng)這個(gè)頁面被緩存之后,刷新時(shí),當(dāng)前時(shí)間顯示不發(fā)生變化。

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)

    {

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

    }

   </script>//head以前。

    protected void Page_Load(object sender, EventArgs e)

    {

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

}

   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

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

◆示例講解

在這個(gè)頁面中<%@ Output Cache Duration = “60” VaryByParam = “none”%>

這段話定義了頁面將要被緩存,并且,其緩存時(shí)間為60秒,并在一個(gè)頁面被緩存之后,通過定義VaryByParam屬性,它不會(huì)因?yàn)閞equest接受的參數(shù)而改變,只有在60秒之后,頁面自動(dòng)清除緩存,此時(shí),第一個(gè)訪問提供了新的緩存。

◆代碼示例:數(shù)據(jù)訪問的小示例,相對(duì)顯示當(dāng)前數(shù)據(jù)示例,這個(gè)示例更能顯示緩存頁之后刷新的性能優(yōu)勢(shì)。

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)

    {

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

    }

   </script>//head以前。

    protected void Page_Load(object sender, EventArgs e)

    {

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

}

   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>//最上面

◆由參數(shù)改變緩存內(nèi)容

有些時(shí)候我們需要根據(jù)用戶的請(qǐng)求來生成頁面,但是用戶的請(qǐng)求只有有限的幾種組合,這個(gè)時(shí)候就可以根據(jù)用戶請(qǐng)求來生成幾種緩存頁面,來進(jìn)行緩存。

◆代碼示例:接受參數(shù)示例,根據(jù)用戶選擇不同的Name顯示不同的數(shù)據(jù)庫內(nèi)容。

最開始部分:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

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

<script runat="server">

 

    protected void Page_Load(object sender, EventArgs e)

    {

 TimeMsg.Text = DateTime.Now.ToString("G");

    }

 

</script>

Body內(nèi)容:

 <span style="font-family: Verdana">Using the Output Cache</span><b>Authors by Name:</b>

 <table cellpadding="3" cellspacing="0" rules="all" style="border-left-color: black;

   border-bottom-color: black; width: 700px; border-top-color: black; border-collapse: collapse;

   background-color: #aaaadd; border-right-color: black">

   <tr>

<td>

  <a href="Default.aspx?Name=李陽">1</a></td>

<td>

  <a href="Default.aspx?Name=陳勝">2</a></td>

<td>

  <a href="Default.aspx?Name=夏秘密">3</a></td>

<td>

  <a href="Default.aspx?Name=范玲玲">4</a></td>

   </tr>

 </table>

 <br />

 <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">

 </asp:GridView>

 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:qimuConnectionString %>"

   SelectCommand="SELECT * FROM [tab1] WHERE ([Name] = @Name)">

   <SelectParameters>

<asp:QueryStringParameter Name="Name" QueryStringField="Name" DefaultValue="李陽" />

   </SelectParameters>

 </asp:SqlDataSource>

 <br />

 <em>Last generated on:</em>

 <asp:Label ID="TimeMsg" runat="server"></asp:Label>&nbsp;

顯示效果:

Using the Output CacheAuthors by Name:

1

2

3

4

 

ID

Name

Sex

1

李陽


Last generated on: 2009-5-10 0:29:13 

◆接受參數(shù)示例解說

關(guān)鍵語句<%@ Output Cache Duration = “60” VaryByParam = “Name”%>

上面顯示一個(gè)數(shù)據(jù)庫查詢示例,并在頁面下端放置一個(gè)訪問的當(dāng)前時(shí)間顯示,可以清楚的看到,對(duì)于每個(gè)不同的參數(shù),一分鐘之內(nèi)的訪問會(huì)得到同一個(gè)時(shí)間戳,這表明用戶在這個(gè)時(shí)間內(nèi)訪問的視同一個(gè)cache。

注意:不足是在60秒以內(nèi)數(shù)據(jù)庫做出改變,不能顯示更新的顯示,需要處理這個(gè)問題還需要其他的設(shè)置。

◆硬盤Output Cache

默認(rèn)情況下,Output Cache會(huì)被緩存到硬盤上。我們可以通過修改diskcacheenable的屬性來設(shè)置其是否緩存,還可以通過在web config里配置緩存文件的大小。

在使用程序的時(shí)候,我們常用內(nèi)存緩存和交換區(qū)緩存,硬盤緩存技術(shù)我們可能用的不是很多,因?yàn)橛X得硬盤速度慢,或者交互起來有問題。實(shí)際上,由于服務(wù)器現(xiàn)在占用內(nèi)存都比較多,尤其是大型的應(yīng)用。所以在IIS服務(wù)默認(rèn)是把硬盤服務(wù)是打開的。

◆使用DiskOutput Cache示例:

<%@ OutputCache Duration="3600" VaryByParam="name" DiskCacheable="true" %>

Web.Config文件中,

<configuration>

     <appSettings/>

     <system.web>

    <caching>

      <outputCache>

 <diskCache enabled="true" maxSizePerApp="2"(2M) />

      </outputCache>

      <outputCacheSettings>

 <outputCacheProfiles>

 <add name="CacheFor60Seconds" duration="60" />

 </outputCacheProfiles>

      </outputCacheSettings>

      <!--

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

 <databases>

     <add name="PubsDB" connectionStringName="pubsConnectionString" />

 </databases>

     </sqlCacheDependency>

     -->

    </caching>

     </system.web>

</configuration>

設(shè)置DiskOutput屬性。

指定硬盤緩存時(shí),指定時(shí)間要相應(yīng)的大一些。硬盤訪問速度相對(duì)慢一點(diǎn)。(VS 2005正式版已經(jīng)刪除了這一個(gè)功能,汗!)

◆回調(diào)緩存

通過設(shè)置回調(diào)緩存機(jī)制,可以針對(duì)每個(gè)請(qǐng)求在頁面中插入動(dòng)態(tài)的部分,以彌補(bǔ)單獨(dú)使用靜態(tài)緩存的不足。

代碼示例:

回調(diào)緩存示例

<%@ Page Language="VB" %>

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

 

<script runat="server">

    Shared Function GetCurrentDate(ByVal context As HttpContext) As String

 Return Now.ToString()

    End Function

</script>

 

<html>

<head id="Head1" runat="server">

    <title>Post Cache Substitution</title>

</head>

<body>

    <form id="form1" runat="server">

 <h4>

   This page uses post cache substitution to insert a dynamic value into a cached page.</h4>

 <p>

   Time:

   <%= DateTime.Now.ToString() %>

 </p>

 <p>

   <b>Real Time:

<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDate" />

   </b>

 </p>

    </form>

</body>

</html>

通過API實(shí)現(xiàn)回調(diào)緩存

<%@ Page Language="VB" %>

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

 

<script runat="server">

 

Shared Function GetCurrentDate(context As HttpContext) As String

 

    return DateTime.Now.ToString()

End Function

 

</script>

 

<html>

<head id="Head1" runat="server">

    <title>Post Cache Substitution</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <b>This page uses post cache substitution to insert a dynamic value into a cached page.</b>

    <br /><br />

    Time: <%= DateTime.Now.ToString() %>

    <br /><br />

    <b>  

    Real Time: <% Response.WriteSubstitution(New HttpResponseSubstitutionCallback(AddressOf GetCurrentDate)) %>

    </b>

    </div>

    </div>

    </form>

</body>

</html>

通過使用SubStitution來實(shí)現(xiàn)緩存

◆使用API定制緩存

如果需要對(duì)緩存進(jìn)行更詳細(xì)的設(shè)置,可以通過設(shè)置System.Web.HttpCachePolicy屬性來進(jìn)行配置下面這個(gè)語句和我們

<%@ Output Cache Duration = “60” VaryByParam = “none”%>完全一樣

üResponse.Cache.SetExpires(Now.AddSeconds(60))

    Response.Cache.SetCacheability(HttpCacheability.Public)

2.Page Fragment Caching

◆作為Output的緩存的附加功能,還提供一種緩存技術(shù),專門用于緩存用戶控件或者網(wǎng)頁中的一部分東西。可以指定沒一部分或者某一個(gè)區(qū)域不被緩存。

◆在頁面中,指定返回參數(shù),來決定控件被緩存的部分。使用語句VaryByparam語句指定控件更具參數(shù)來改變。

◆示例:通過返回參數(shù)改變緩存內(nèi)容示例

用戶控件頁面設(shè)置:

<%@ Control Language="vb" %>

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

調(diào)用控件頁面設(shè)置:

<%@ Register TagPrefix="Acme" TagName="DataControl" Src="datactrl.ascx" %>

Body部分:

     <h3>

 <font face="Verdana">Fragment Caching</font></h3>

    <Acme:DataControl runat="server" />

    <br>

    <i>頁面最后被訪問于:</i>

    <asp:Label ID="TimeMsg" runat="server" />

◆接受控件傳參數(shù)修改

緩存用戶控件同樣還可以使用控件作為參數(shù)來源。通過指定控件作為緩存控件的參數(shù)來源,可以達(dá)到緩存控件數(shù)據(jù)的目的。

示例:通過控件參數(shù)改變緩存內(nèi)容示例

用戶控件頁面設(shè)置:

<%@ Control Language="VB" ClassName="FragCtrlwithAPI" %>

<%@ OutputCache Duration="60" VaryByControl="pickstate" %>

 

<script runat="server">

    Private duration As TimeSpan

   

    Sub Page_Load(ByVal sender As Object, ByVal E As EventArgs)

 If (pickstate.SelectedValue = "CA") Then

   duration = New TimeSpan(0, 0, 10)

   CachePolicy.Duration = duration

 End If

    End Sub

 

    Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)

 Label1.Text = Now.ToString("G")

 Label2.Text = Now.Add(CachePolicy.Duration).ToString("G")

    End Sub

</script>

 

<div style="border: dotted 1px blue; padding: 5px; background-color: #eeeeee;">

    <asp:DropDownList ID="pickstate" runat="server" AutoPostBack=true>

 <asp:ListItem Text="CA" Value="CA" />

 <asp:ListItem Text="UT" Value="UT" />

 <asp:ListItem Text="MD" Value="MD" />

 <asp:ListItem Text="OR" Value="OR" />

 <asp:ListItem Text="MI" Value="MI" />

 <asp:ListItem Text="TN" Value="TN" />

    </asp:DropDownList>

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"

 SelectCommand="SELECT [au_id], [au_lname], [au_fname], [phone], [address], [city], [state], [zip], [contract] FROM [authors] where state=@state"

 ProviderName="System.Data.SqlClient">

 <SelectParameters>

   <asp:ControlParameter ControlID="pickstate" DefaultValue="CA" Name="state" PropertyName="SelectedValue" />

 </SelectParameters>

    </asp:SqlDataSource>

    <asp:GridView ID="GridView1" runat="server" DataSourceID="sqldatasource1" />

    <p>

控件被建立于<asp:Label ID="Label1" runat="server" Text="Label"/><br />

 控件被銷毀<asp:Label ID="Label2" runat="server" Text="Label"/><br />     

    </p>

</div>

調(diào)用控件頁面設(shè)置:

<%@ Register Src="datactrlnew.ascx" TagName="FragCtrl" TagPrefix="acme" %>

Body部分:

   <acme:FragCtrl ID="FragCtrl1" runat="server" />

   當(dāng)前時(shí)間:

   <%=Now.ToString("G") %>

   <asp:Button ID="Button2" runat="server" Text="Refresh" />

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

◆ASP.NET提供了一種非常快捷的方法進(jìn)行數(shù)據(jù)庫緩存,用戶可以非常方便的對(duì)頁面變量進(jìn)行緩存。并以此提高程序效率。

◆一個(gè)頁面變量的緩存生命周期與應(yīng)用程序的緩存生命周期相同。

◆同時(shí)對(duì)后臺(tái)數(shù)據(jù)進(jìn)行修改的時(shí)候,還需要對(duì)Cache進(jìn)行相應(yīng)的處理。

◆示例:使用數(shù)據(jù)緩存示例:

<%@ Page Language="vb" %>

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

 

<html>

 

<script runat="server">

    Sub Page_Load(ByVal Src As Object, ByVal E As EventArgs)

 Dim Source As DataView

 

 ' try to retrieve item from cache

 ' if it's not there, add it

 Source = Cache("MyDataSet")

 

 If Source Is Nothing Then

   Dim MyConnection As SqlConnection

   Dim MyCommand As SqlDataAdapter

 

   MyConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("pubsConnectionString").ConnectionString)

   MyCommand = New SqlDataAdapter("select * from Authors", MyConnection)

 

   Dim ds As New DataSet

   MyCommand.Fill(ds, "Authors")

 

   Source = New DataView(ds.Tables("Authors"))

   Cache("MyDataSet") = Source

 

   CacheMsg.Text = "Dataset created explicitly"

 Else

   CacheMsg.Text = "Dataset retrieved from cache"

 End If

 

 MyGrid.DataSource = Source

 MyGrid.DataBind()

    End Sub

 </script>

 

<body>

    <form id="Form1" runat="server">

 <h3>

   <font face="Verdana">Caching Data</font></h3>

 <asp:GridView ID="MyGrid" runat="server">

 </asp:GridView>

 <p>

   <i>

<asp:Label ID="CacheMsg" runat="server" /></i>

 </p>

    </form>

</body>

</html>

4.SQL Cache

前面的例子中,我們使用的是緩存技術(shù),一旦時(shí)間到,無論服務(wù)器端的數(shù)據(jù)是否改變都會(huì)釋放緩存,下面介紹的例子,通過配置數(shù)據(jù)庫連接池,只有當(dāng)數(shù)據(jù)庫數(shù)據(jù)被改變的時(shí)候,緩存才會(huì)改變。

示例:配置連接池示例

開一個(gè)DOS窗口->找到aspnet_regsql.exe工具(常用參數(shù):-s指定我們注冊(cè)的服務(wù)器-E使用Windows授權(quán)模式-D指定數(shù)據(jù)庫DataBase名字-ED緩存生效)->

aspnet_regsql.exe –s “.SQLExPress” –E –d “pubs” –ed

aspnet_regsql.exe –s “.SQLExPress” –E –d “pubs” –et –t  “authors”

<%@ OutputCache Duration = “999999” SqlDependency = “Pubs:Authors” VaryByParam = “none”%>

5.Cache Configuration

可以通過在webconfig里配置不同的緩存描述,在頁面中調(diào)用該描述來減少重復(fù)定義緩存描述的工作量。

示例:緩存描述定義示例:

<configuration>

     <appSettings/>

     <system.web>

    <caching>

      <outputCache>

 <diskCache enabled="true" maxSizePerApp="2"(2M) />

      </outputCache>

      <outputCacheSettings>

 <outputCacheProfiles>

 <add name="CacheFor60Seconds" duration="60" />

 </outputCacheProfiles>

      </outputCacheSettings>

      <!--

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

 <databases>

     <add name="PubsDB" connectionStringName="pubsConnectionString" />

 </databases>

     </sqlCacheDependency>

     -->

    </caching>

     </system.web>

</configuration>

6.總結(jié)

◆Output Caching

◆Fragment Caching

◆Data Caching

◆SQL Cache

◆Cache Configuration

【編輯推薦】

  1. ASP.NET視頻教程
  2. ASP.NET MVC框架視頻教程
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-07-29 15:38:01

2009-07-31 10:23:44

緩存頁面ASP.NET緩存

2009-07-22 17:23:03

XmlDataSourASP.NET 2.0

2009-07-30 15:17:16

ASP.NET 2.0

2009-08-04 15:22:33

ASP.NET緩存機(jī)制

2009-07-29 14:35:34

頁面輸出緩存ASP.NET

2009-07-31 10:33:54

ASP.NET頁面輸出

2009-07-29 10:35:51

ASP.NET緩存

2009-07-22 17:21:27

ASP.NET 2.0

2009-07-30 14:00:21

ASP.NET 2.0

2009-07-28 14:06:28

ASP.NET 2.0

2009-01-07 11:38:22

ASP.NET.NET錯(cuò)誤記錄

2009-12-14 17:50:45

ASP.NET 2.0

2009-07-21 14:37:13

Profile Pro優(yōu)化ASP.NET 2

2009-07-30 14:55:43

ASP.NET 2.0

2009-07-29 15:34:13

2009-07-24 11:37:58

ASP.NET壓力測(cè)試

2009-07-27 16:53:15

ASP.NET 2.0

2009-08-17 16:59:36

ASP.NET緩存機(jī)制

2009-08-03 18:35:51

ASP.NET數(shù)據(jù)緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)