ASP.NET 缓存入门教程






4.83/5 (29投票s)
本文是一篇关于 ASP.NET 缓存机制的入门教程。
引言
本文是一篇关于 ASP.NET 缓存机制的入门教程。我们将尝试了解 ASP.NET 中可用的不同类型的缓存,以及哪种缓存技术适合哪种场景。我们还将尝试了解如何自定义缓存行为,使其能够满足我们的需求。
背景
作为 ASP.NET Web 开发者,我们通常会开发动态的网页,即内容来自数据库、服务器目录、XML 文件或从其他网站获取。缓存意味着将频繁使用的内容存储在内存中以提供更好的性能。现在,我们来考虑缓存的可用性在 ASP.NET 中的应用。
让我们设想一个场景,其中网页的内容来自数据库。用户根据某些标准请求内容。现在,如果数据库更改非常频繁,即使在同一用户两次请求之间,我们也预计数据库会发生变化,那么我们绝对无法缓存用户请求的数据。但是,如果数据库更改不那么频繁,我们可以进行一些缓存,这样如果用户频繁请求相同的数据,我们就不会每次都访问数据库(因为我们知道内容没有改变)。
这里的两个关键术语是频率和标准。频率是我们预计用户请求特定页面的次数,标准是决定页面上显示结果唯一性的因素。
频率很重要,因为我们需要弄清楚数据库更改的间隔,并将其与用户请求的频率进行比较,以便我们可以进行缓存,同时还要确保用户不会看到过时的数据。
标准很重要,因为我们需要确保我们针对每个唯一标准实现了页面缓存。不能出现用户根据 criteria01
请求内容,而我们却向他显示(之前为他缓存的)criteria00
的缓存结果的情况。
因此,带着这些理论知识,让我们继续看看 ASP.NET 如何提供缓存功能,而无需我们编写大量代码来管理它。
缓存类型
ASP.NET 中有两种缓存可用
- 页面输出缓存
- 应用程序缓存
页面输出缓存
页面输出缓存是指 Web 服务器能够将用户的某个网页请求缓存到内存中,以便后续对同一页面的请求会检查缓存页面的有效性,而不会导致资源消耗(数据库访问或文件访问),并且页面将从缓存中返回给用户。
现在的问题是我们如何确保用户不会看到过时的数据。ASP.NET 为我们提供了各种配置选项,让我们可以通过编程方式确保用户永远不会获得过时的数据。
让我们有一个简单的网页,其中包含一个文本框、一个按钮和一个标签。目前,此页面未启用缓存,因此每次发生回发时,都会向 Web 服务器发出请求。我们可以通过在标签中显示当前时间来验证这一点。
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToLongTimeString();
}
现在,让我们通过将以下声明添加到页面来启用此页面的缓存:
<%@ OutputCache Duration="30" VaryByParam="none" %>
在这里,我们说此页面应缓存 30 秒。通过按按钮可以验证这一点。时间字符串将在 30 秒内不变,并且 VaryByParam
属性指定缓存不依赖于任何内容,因此可能导致用户看到过时数据的情况,就像在我们的例子中,30 秒内,如果我们输入一些文本框中的内容并执行回发,它将一直回退到页面缓存时文本框中的旧数据。

所以,最好说当文本框中的内容更改时,缓存的页面无效,所以我们现在就来做。
<%@ OutputCache Duration="30" VaryByParam="TextBox1" %>
因此,现在我们可以看到,只要 textbox
的内容不发生变化,页面输出就会被缓存。如果我们更改 textbox
的内容,服务器将再次处理该页面,然后再次缓存它。

因此,我们看到我们可以指定页面应该缓存的 Duration
,这与我们之前讨论的频率有关。Duration
的选择应使其在预期数据不发生更改的时间段内,并且对于标准,我们看到了如何使用 VaryByCustom
来确保为每个不同的标准生成输出,并且不只是将缓存的副本呈现给用户。
让我们看一下我们可以用来自定义缓存行为的其他参数。
VaryByParam
:通过POST
发送到服务器的string
列表,用于验证缓存VaryByControl
:其值将决定缓存有效性的控件列表SqlDependency
:定义缓存有效性所依赖的数据库-表名对VaryByCustom
:用于自定义输出缓存需求VaryByHeader
:决定缓存有效性的 HTTP 标头
如果我们因查询 string
而需要不同的输出页面,那么我们可以指定 querystring
参数的列表,或者我们可以简单地说 VaryByParam ="*"
来对所有 querystring
参数执行相同的操作。现在,让我们快速了解一下如果我们想根据查询 string
参数更改缓存页面需要做什么。
<%@ OutputCache Duration="30" VaryByParam="name" %>
protected void Button2_Click(object sender, EventArgs e)
{
int name;
if (Request.QueryString["name"] == null)
{
name = 1;
}
else
{
name = Convert.ToInt32(Request.QueryString["name"]) + 1;
}
Response.Redirect("varybyqs.aspx?name=" + name.ToString());
}
部分页面缓存
另外,如果我们有部分页面缓存(片段缓存)的需求,我们可以简单地使用需要缓存的控件并将其放入用户控件中。然后,我们可以使用上面提到的相同技术在自定义控件中启用缓存行为,从而实现部分页面缓存。(请参阅代码以了解实现方法。)

注意:上述方法使我们能够通过在页面上使用声明来使用缓存。我们也可以通过编程方式控制缓存。
应用程序缓存
应用程序数据缓存是存储 Data
对象到缓存的机制。它与页面缓存无关。ASP.NET 允许我们以 Key
-Value
为基础的缓存存储对象。我们可以使用它来存储需要缓存的数据。让我们使用相同的示例,并尝试将 DateTime
对象存储到应用程序缓存中。
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack == false)
{
Cache["time"] = DateTime.Now;
}
Label1.Text = ((DateTime)Cache["time"]).ToLongTimeString();
}
这段代码的作用是将 DateTime
对象存储在应用程序缓存中,并继续显示初始请求的时间,方法是从缓存中使用该对象。

应用程序数据缓存有各种参数,可用于控制其行为。
Dependencies
:缓存中的任何文件或项,它们会使此缓存项失效absoluteExpiration
:对象应从缓存中移除的绝对时间slidingExpiration
:对象应从缓存中移除的相对时间priority
:定义项的优先级。当服务器内存不足时,此项很有用,因为在这种情况下,它会首先开始从缓存中移除优先级最低的项。onRemoveCallBack
:当对象从缓存中移除时会调用的事件处理程序。它为我们提供了一个采取进一步行动的地方。
注意:源代码包含每种技术的单独页面。单独运行每个页面以查看缓存效果。
关注点
现在让我们总结一下我们到目前为止所看到的。
- ASP.NET 提供了缓存功能,以便开发人员可以使用它们,而无需手动编写所有缓存逻辑。
- 当我们要根据某些标准和特定时间缓存完整的网页时,应使用页面输出缓存。
- 当我们想要缓存自定义对象以供以后使用时,应使用应用程序缓存。
- 应用程序缓存提供了许多参数来自定义其行为,以获得更精细化的控制。
历史
- 2012 年 2 月 21 日:ASP.NET 缓存入门教程