Asp.net 简明教程

ASP.NET - Data Caching

What is Caching?

缓存是用来将经常使用的数据/信息存储在内存中的技术,这样,下一次需要相同的数据/信息时,可以从内存中直接检索数据/信息,而不需要由应用程序生成它。

缓存对于提升 ASP.NET 的性能非常重要,因为页面和控件在这里会被动态生成。这对于数据相关事务尤为重要,因为这些事务对于响应时间来说开销很大。

缓存将经常使用的数据放在诸如计算机随机存取内存的快速访问媒体中。ASP.NET 运行时包含称为缓存的 CLR 对象键值映射。这与应用程序同驻,并且可以通过 HttpContext 和 System.Web.UI.Page 获得。

在某些方面,缓存类似于存储状态对象。但是,状态对象中存储信息是确定性的,换句话说,您可以依赖存储在此处的数据,并且数据的缓存是不确定性的。

在以下情况下数据将不可用:

  1. If its lifetime expires,

  2. 如果应用程序释放其内存,

  3. 如果由于某些原因未发生缓存。

您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生存期,以及设置缓存对象及其物理源之间的链接。

Caching in ASP.Net

ASP.NET 提供以下不同类型的缓存:

  1. Output Caching : 输出缓存会存储最终渲染的 HTML 页面或发送至客户端的页面的部分的副本。当下一个客户端请求此页面时,将发送页面的缓存副本,而不是重新生成页面,从而节省时间。

  2. Data Caching : 数据缓存表示将数据源中的数据缓存起来。只要缓存未过期,请求的数据就会从缓存中获得。当缓存过期时,将由数据源获取新鲜数据,并且缓存将重新填充。

  3. Object Caching : 对象缓存是指缓存页面上的对象,例如数据绑定控件。缓存数据存储在服务器内存中。

  4. Class Caching :在首次运行时,网页或 Web 服务会编译为程序集中的一个页面类。然后该程序集将缓存在服务器中。下次对页面或服务进行请求时,将引用缓存的程序集。当源代码发生更改时,CLR 将重新编译程序集。

  5. Configuration Caching :应用程序范围内的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。

在本教程中,我们将考虑输出缓存、数据缓存和对象缓存。

Output Caching

呈现页面可能涉及一些复杂的过程,例如数据库访问、呈现复杂控件等。输出缓存通过将数据缓存在内存中来绕过服务器的往返行程。甚至可以缓存整个页面。

OutputCache 指示负责输出缓存。它启用输出缓存并对其行为提供了一定的控制。

OutputCache 指示的语法:

<%@ OutputCache Duration="15" VaryByParam="None" %>

将此指示置于页面指示之下。这会指示环境缓存页面 15 秒。对于页面加载的以下事件处理程序,可帮助测试页面是否确实已缓存。

protected void Page_Load(object sender, EventArgs e)
{
   Thread.Sleep(10000);
   Response.Write("This page was generated and cache at:" +
   DateTime.Now.ToString());
}

Thread.Sleep() 方法会停止进程线程一段时间。在此示例中,线程会停止 10 秒,因此首次加载页面时,需要 10 秒的时间。不过,下次刷新页面时无需任何时间,因为页面可以直接从缓存中检索,无需加载。

OutputCache 指示具有以下特性,有助于控制输出缓存的行为:

Attribute

Values

Description

DiskCacheable

true/false

指定可以将输出写入基于磁盘的缓存。

NoStore

true/false

指定是否要发送“禁止存储”缓存控制标头。

CacheProfile

String name

一个缓存配置文件的名称(将存储在 web.config 中)。

VaryByParam

None * Param- name

以分号分隔的字符串列表,指定 GET 请求中的查询字符串值或 POST 请求中的变量。

VaryByHeader

* Header names

以分号分隔的字符串列表,指定客户端可能提交的标头。

VaryByCustom

Browser Custom string

指示 ASP.NET 根据浏览器名称和版本或自定义字符串来改变输出缓存。

Location

Any Client Downstream Server None

Any:页面可以在任何位置进行缓存。Client:缓存在浏览器中的内容。Downstream:缓存在下游和服务器中的内容。Server:仅在服务器上保存缓存在内容。None:禁用缓存。

Duration

Number

页面或控件缓存的秒数。

让我们在上一个示例中添加一个文本框和一个按钮,并为按钮添加此事件处理程序。

protected void btnmagic_Click(object sender, EventArgs e)
{
   Response.Write("<br><br>");
   Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}

更改 OutputCache 指令:

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

当程序执行时,ASP.NET 会根据文本框中的名称缓存页面。

Data Caching

数据缓存的主要方面是缓存数据源控件。我们已经讨论过,数据源控件表示数据源中的数据,例如数据库或 XML 文件。这些控件源自抽象类 DataSourceControl,并具有以下用于实现缓存的继承属性:

  1. CacheDuration - 它设置数据源将缓存数据的秒数。

  2. CacheExpirationPolicy - 它在缓存中的数据过期时定义缓存行为。

  3. CacheKeyDependency - 它标识控件的键,这些键会在内容从缓存中移除时自动使缓存的内容过期。

  4. EnableCaching - 它指定是否缓存数据。

Example

要演示数据缓存,请创建一个新网站并在其中添加一个新 Web 窗体。添加一个 SqlDataSource 控件,该控件使用数据访问教程中已经使用的数据库连接。

对于此示例,向页面添加一个标签,该标签将显示页面的响应时间。

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

除了标签以外,内容页面与数据访问教程中的相同。添加一个页面加载事件的事件处理程序:

protected void Page_Load(object sender, EventArgs e)
{
   lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}

设计好的页面应如下所示:

data caching

第一次执行页面时,没有出现不同的情况,标签显示,每当你刷新页面时,页面都会重新加载,并且标签上显示的时间也会随之更改。

接下来,将数据源控件的 EnableCaching 属性设置为“true”,并将 Cacheduration 属性设置为“60”。这将实现缓存,并且缓存将在每 60 秒到期。

时间戳会随着每次刷新而更改,但是如果你在此 60 秒内更改了表中的数据,则在缓存过期之前不会显示。

<asp:SqlDataSource ID = "SqlDataSource1" runat = "server"
   ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>"
   ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>"
   SelectCommand = "SELECT * FROM [DotNetReferences]"
   EnableCaching = "true" CacheDuration = "60">
</asp:SqlDataSource>

Object Caching

对象缓存比其他缓存技术提供了更多的灵活性。你可以使用对象缓存来将任意对象放在缓存中。对象可以是任何类型 - 数据类型、Web 控件、类、数据集对象,等等。简单地通过分配一个新键名,就可以将该项添加到缓存中,如下所示:

Cache["key"] = item;

ASP.NET 也提供了用于向缓存插入对象的 Insert() 方法。此方法有四个重载版本。我们看一下它们:

Overload

Description

Cache.Insert((key, value);

使用默认优先级和过期时间将一项插入到缓存中,并附带键名和值。

Cache.Insert(key, value, dependencies);

使用键、值、默认优先级、过期时间和一个 CacheDependency 名称将一项插入到缓存,该名称链接到其他文件或项,以便当这些文件或项发生更改时,缓存项将不再有效。

Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration);

这表示过期策略以及上述问题。

Cache.Insert(键, 值, 依赖项, 绝对过期时间, 滑动过期时间, 优先级, 删除后回调);

这与参数一起也允许您为缓存项设置优先级,以及在删除项目时需要调用的方法的委托。

滑动过期时间用于在缓存项一段时间未使用时将其从缓存中删除。以下代码段使用滑动过期时间存储项,该过期时间为 10 分钟,并且没有依赖项。

Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

Example

只创建一个包含按钮和标签的页面。在页面加载事件中编写以下代码:

protected void Page_Load(object sender, EventArgs e)
{
   if (this.IsPostBack)
   {
      lblinfo.Text += "Page Posted Back.<br/>";
   }
   else
   {
      lblinfo.Text += "page Created.<br/>";
   }

   if (Cache["testitem"] == null)
   {
      lblinfo.Text += "Creating test item.<br/>";
      DateTime testItem = DateTime.Now;
      lblinfo.Text += "Storing test item in cache ";
      lblinfo.Text += "for 30 seconds.<br/>";
      Cache.Insert("testitem", testItem, null,
      DateTime.Now.AddSeconds(30), TimeSpan.Zero);
   }
   else
   {
      lblinfo.Text += "Retrieving test item.<br/>";
      DateTime testItem = (DateTime)Cache["testitem"];
      lblinfo.Text += "Test item is: " + testItem.ToString();
      lblinfo.Text += "<br/>";
   }

   lblinfo.Text += "<br/>";
}

当页面第一次加载时,其提示:

Page Created.
Creating test item.
Storing test item in cache for 30 seconds.

如果您在 30 秒内再次单击按钮,页面会返回,但标签控件会从缓存中获取其信息,如下所示:

Page Posted Back.
Retrieving test item.
Test item is: 14-07-2010 01:25:04