如果有人用枪抵着我的脑袋告诉我,只有五分钟来改进网站的性能,我会立即想到缓存。
利用缓存,可以极大改善Web 应用程序的性能。
ASP.NET 页面中执行最慢的操作是数据库访问。打开一个数据库连接并读取数据库是一个很慢的操作。改进数据访问代码性能的最好方法是根本不访问数据库。
利用缓存,可以再内存中把数据库记录缓存起来。从数据库读取数据是很缓慢的,相比而言,从缓冲读取数据则像闪电一样快。
.NET Framework 支持下面这些类型的缓存:
· 页面输出缓存
· 部分页面缓存
· 数据源缓存
· 数据缓存
页面数据输出缓存用于缓存页面呈现的所有内容(即在浏览器中选择查看源代码时能看到的所有内容)到内存中。当下一次任何用户请求相同的页面时,页面将从缓存中读取。
页面数据缓存作用于整个页面。在某些情况下,这会出现问题。
例如: 原本希望在页面随即显示不同的广告条,而如果缓存了整个页面,再次请求这个页面时,只会显示相同的广告条。
部分页面缓存通过只缓存页面上的一个特定区域来解决这个问题。利用部分页面缓存,可以对页面的不同区域应用不同的缓存策略。
数据缓存是最基本的缓存机制。在内部,所有其他类型的缓存都是使用数据缓存来实现的。可以使用数据缓存在内存中缓存任意的对象。
例如:可以使用数据缓存在应用程序的多个页面缓存一个DataSet。
注解:当配置和调试缓存时,可以用Fiddler工具,可以用来查看HTTP通信的原始请求和响应。
· 使用页面输出缓存
可以给一个页面添加<% OutputCache%> 指令启用页面输出缓存。
例如:
<% OutputCache Duration="15" VaryByParam="none" %> 注: Duration="15" 表示设置页面缓存15秒。 可以设置更大的Duration
例如:可以赋值86400给Duration属性,那么页面就会缓存一天。页面并不绝对保证会缓存到我们指定的时间。当服务器内存资源变低时,缓存项会自动从缓存中移除。
当一个页面被缓存时,被请求时的页面内容并不会每次都重新生成。每次请求一个页面,对应到页面的.net类也不会执行。 对于每一个请求页面的用户,页面呈现的内容都会缓存。
页面可在多个闻之缓存。 默认情况下,页面可以缓存在浏览器、任意的代理服务器以及Web服务器。
下面是整个页面缓存10秒的一个例子:
HTML 代码(Default.aspx):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Example.Web.Default" %>
<%@ OutputCache Duration="10" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" language="javascript">
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblTime" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
Default.aspx.cs 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Example.Web
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString("T");
}
}
}
当刷新页面时可以看到页面上的时间每10秒才会变动一次。
可以使用Response.RemoveOutputCacheItem()方法,以变成方式从缓存中移除一个页面。
以编程方式操作页面输出缓存:
HttpCachePolicy 类包含的属性和方法可用来以编程方式执行<% OutputCache %> 指令可以设置的所有任务。
HttpCachePolicy类由Response.Cache属性暴露。
例如(让页面缓存10秒),页面不设置<%@ OutputCache%>
Default.aspx.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Example.Web
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
Response.Cache.SetMaxAge(TimeSpan.FromSeconds(10));
Response.Cache.SetValidUntilExpires(true);
Response.Cache.SetLastModified(DateTime.Now);
Response.Cache.SetOmitVaryStar(true);
lblTime.Text = DateTime.Now.ToString("T");
}
}
}