ASP.Net性能优化——页面输出缓存
在计算机科学领域,广泛应用缓冲技术来提高系统的性能,它的原理是把经常存取的或者是比较重要的数据保存于内存中以减少系统的响应时间。对于WEB应用领域,缓冲技术主要是把HTTP请求的页面或数据保存于内存,以减少下次使用时重建它们的耗费。
ASP.NET有两种用于WEB应用的缓冲技术:输出缓冲和数据缓冲。
输出缓冲指:把一次请求所产生的动态输出保存于内存中。
数据缓冲指:按照一定的策略把事先不确定的对象保存于内存中。
输出缓冲常用于把整个输出页面缓冲起来。对于一个存取繁忙的站点来说,把一些常用页面放入内存会带来性能上的极大提高。当一个页面被放入输出缓存,那么接下来的对该页面的请求将不再执行创建它的代码,而是从内存中直接返回该页面。
但实际上,保存整个输出页面的方法并不一定都行得通,因为有些页面的输出取决于客户端的不同请求,称之为“定制”。这时,采取的方法即找出不同中的相同,把一些并不需要经常重新创建的对象和数据识别出来,进行缓冲。一旦这些部分被识别,那么它们将被一次创建并在缓存中保持一定的时间。
选择缓存的时间是提高性能的关键。对一些部分来说,它们需要隔一定时间进行刷新,而另一些部分来说,可能仅仅只是需要保存一段时间。此种情况下,都可以设定“过期策略”来实现。一旦这些对象和数据到期,它们都将被从缓存中清除出去。当存取对象和数据的代码发现所要求的部分在内存中不存在时,将重建该对象或数据。
ASP.NET支持文件和缓存关键字的依赖关系,它允许开发人员创建缓存依赖于一个外部文件或另一个缓存事物。利用这项技术可以更新一个缓存事物当其依赖的源文件发生改变时。
1 基本概念
页面输出缓存通过保存动态页面的输出内容,大大提高了服务器应用的能力。缺省情况下,输出缓存选项是被打开的,但并不是任意给定的输出响应都将被缓存,除非显示地指定页面应被缓存。
为使输出能够被缓存,输出响应至少应有一个有效的过期/有效策略以及公用cache的访问权限。当一个GET请求被送往页面,一个输出缓冲入口将被创建。接下来,对该页面的GET请求和HEAD的请求将直接从该缓冲入口中取出返回给用户,而对该页面的POST请求通常是显示地产生动态内容,却并非如同GET和HEAD请求一样从缓冲入口中取出。
输出缓存还支持带请求串的GET方法,把请求串作为页面识别的一部分。这就意味着带有相同键值但排列次序不同的请求串的GET请求,可能导致缓存中认为不存在该输出页面。
输出缓存需要知道页面缓存的过期/有效时间策略。如果一个页面在输出缓存中,而且又被指定为60分钟的页面过期时间,那么从它进入输出缓存开始,60分钟后该页面将从输出缓存中被清除。如果恰在此时,有一个对该页面的请求到达,页面的代码将被执行,页面输出又将重新进入输出缓冲。这种方式的过期策略称之为“强制过期”,页面只在一定时间内有效。
如下,我们可以用下面一条语句来显示的指出页面在输出缓冲中的保存时间。
<%@ OutputCache Duration=秒数 %>
2 实例
下面举一个简单的例子来证实ASP.NET中的页面缓存功能
在一个页加载时,我们显示它的时间,在页面过期时间(设为:10秒)到达之前,我们把页面刷新(相当于重发GET请求),看一看显示的时间;然后,在过期时间到达之后,再看显示的时间。如果,第一次和第二次显示的时间相同,那么就证明了,系统存在有页面输出缓存功能,做为对比,当过期时间到达后,新的请求将导致重新执行页面代码,产生新的时间显示。
程序源程序
第一次输出效果:
第二次输出效果:
第三次输出效果:
实现页面缓存的另一种方法:
例如上面的例子可以改写成如下例子:
输出的结果和上一例子大体相同,就不在重复了。
ASP.NET有两种用于WEB应用的缓冲技术:输出缓冲和数据缓冲。
输出缓冲指:把一次请求所产生的动态输出保存于内存中。
数据缓冲指:按照一定的策略把事先不确定的对象保存于内存中。
输出缓冲常用于把整个输出页面缓冲起来。对于一个存取繁忙的站点来说,把一些常用页面放入内存会带来性能上的极大提高。当一个页面被放入输出缓存,那么接下来的对该页面的请求将不再执行创建它的代码,而是从内存中直接返回该页面。
但实际上,保存整个输出页面的方法并不一定都行得通,因为有些页面的输出取决于客户端的不同请求,称之为“定制”。这时,采取的方法即找出不同中的相同,把一些并不需要经常重新创建的对象和数据识别出来,进行缓冲。一旦这些部分被识别,那么它们将被一次创建并在缓存中保持一定的时间。
选择缓存的时间是提高性能的关键。对一些部分来说,它们需要隔一定时间进行刷新,而另一些部分来说,可能仅仅只是需要保存一段时间。此种情况下,都可以设定“过期策略”来实现。一旦这些对象和数据到期,它们都将被从缓存中清除出去。当存取对象和数据的代码发现所要求的部分在内存中不存在时,将重建该对象或数据。
ASP.NET支持文件和缓存关键字的依赖关系,它允许开发人员创建缓存依赖于一个外部文件或另一个缓存事物。利用这项技术可以更新一个缓存事物当其依赖的源文件发生改变时。
1 基本概念
页面输出缓存通过保存动态页面的输出内容,大大提高了服务器应用的能力。缺省情况下,输出缓存选项是被打开的,但并不是任意给定的输出响应都将被缓存,除非显示地指定页面应被缓存。
为使输出能够被缓存,输出响应至少应有一个有效的过期/有效策略以及公用cache的访问权限。当一个GET请求被送往页面,一个输出缓冲入口将被创建。接下来,对该页面的GET请求和HEAD的请求将直接从该缓冲入口中取出返回给用户,而对该页面的POST请求通常是显示地产生动态内容,却并非如同GET和HEAD请求一样从缓冲入口中取出。
输出缓存还支持带请求串的GET方法,把请求串作为页面识别的一部分。这就意味着带有相同键值但排列次序不同的请求串的GET请求,可能导致缓存中认为不存在该输出页面。
输出缓存需要知道页面缓存的过期/有效时间策略。如果一个页面在输出缓存中,而且又被指定为60分钟的页面过期时间,那么从它进入输出缓存开始,60分钟后该页面将从输出缓存中被清除。如果恰在此时,有一个对该页面的请求到达,页面的代码将被执行,页面输出又将重新进入输出缓冲。这种方式的过期策略称之为“强制过期”,页面只在一定时间内有效。
如下,我们可以用下面一条语句来显示的指出页面在输出缓冲中的保存时间。
<%@ OutputCache Duration=秒数 %>
2 实例
下面举一个简单的例子来证实ASP.NET中的页面缓存功能
在一个页加载时,我们显示它的时间,在页面过期时间(设为:10秒)到达之前,我们把页面刷新(相当于重发GET请求),看一看显示的时间;然后,在过期时间到达之后,再看显示的时间。如果,第一次和第二次显示的时间相同,那么就证明了,系统存在有页面输出缓存功能,做为对比,当过期时间到达后,新的请求将导致重新执行页面代码,产生新的时间显示。
程序源程序
<!--文件名: performance\FormPageCache.aspx-->
<%@ OutputCache Duration="10" %>
<!--过期时间设为10秒-->
<html>
<head>
<title>
页面输出缓存测试
</title>
</head>
<body >
<center>
<h2><font face="Verdana">测试页面输出缓存实验</font></h2>
<p><p><p>
<hr>
</center>
<asp:label id="lblTime" runat="server"/>
</body>
</html>
<%@ OutputCache Duration="10" %>
<!--过期时间设为10秒-->
<html>
<head>
<title>
页面输出缓存测试
</title>
</head>
<body >
<center>
<h2><font face="Verdana">测试页面输出缓存实验</font></h2>
<p><p><p>
<hr>
</center>
<asp:label id="lblTime" runat="server"/>
</body>
</html>
<!--文件名: FormPageCache.aspx.cs-->
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// FormPageCache 的摘要说明。
/// </summary>
public class FormPageCache : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
lblTime.Text ="现在时间是:" + DateTime.Now.ToString();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// FormPageCache 的摘要说明。
/// </summary>
public class FormPageCache : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
lblTime.Text ="现在时间是:" + DateTime.Now.ToString();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
第一次输出效果:
第三次输出效果:
实现页面缓存的另一种方法:
//指定页面输出缓存下一个10秒到期
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
//指定所有用户都有对缓存的访问权力
Response.Cache.SetCacheability(HttpCacheability.Public);
//如果不希望进行页面缓存,可采用Response.Cache.SetSlidingExpiration方法,当其为True时,每次页面请求到达时,相当于页面过期时间到了,就要对页面输出重新刷新 。
//当每次页面请求时,重置到期时间计数器,并且页面到期
Response.Cache.SetSlidingExpiration(true);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
//指定所有用户都有对缓存的访问权力
Response.Cache.SetCacheability(HttpCacheability.Public);
//如果不希望进行页面缓存,可采用Response.Cache.SetSlidingExpiration方法,当其为True时,每次页面请求到达时,相当于页面过期时间到了,就要对页面输出重新刷新 。
//当每次页面请求时,重置到期时间计数器,并且页面到期
Response.Cache.SetSlidingExpiration(true);
例如上面的例子可以改写成如下例子:
<!--文件名:FormPageCache01.aspx-->
<html>
<head>
<title>
页面输出缓存测试1
</title>
</head>
<body >
<center>
<h2><font face="Verdana">测试页面输出缓存实验1</font></h2>
<p><p><p>
<hr>
</center>
<asp:label id="lblTime" runat="server"/>
</body>
</html>
<html>
<head>
<title>
页面输出缓存测试1
</title>
</head>
<body >
<center>
<h2><font face="Verdana">测试页面输出缓存实验1</font></h2>
<p><p><p>
<hr>
</center>
<asp:label id="lblTime" runat="server"/>
</body>
</html>
<!--文件名:FormPageCache01.aspx.cs-->
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// FormPageCache 的摘要说明。
/// </summary>
public class FormPageCache : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
Response.Cache.SetCacheability(DateTime.Now.AddSeconds(10));
lblTime.Text ="现在时间是:" + DateTime.Now.ToString();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// FormPageCache 的摘要说明。
/// </summary>
public class FormPageCache : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
Response.Cache.SetCacheability(DateTime.Now.AddSeconds(10));
lblTime.Text ="现在时间是:" + DateTime.Now.ToString();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
输出的结果和上一例子大体相同,就不在重复了。