ASP.Net教程

ASP.NET 数据缓存

什么是缓存?

缓存是一种将经常使用的数据/信息存储在内存中的技术,以便下次需要相同的数据/信息时,可以直接从内存中检索,而不是由应用程序生成。
缓存对于 ASP.NET 中的性能提升极为重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务尤其重要,因为这些事务在响应时间方面很昂贵。
缓存将经常使用的数据放在快速访问的媒体中,例如计算机的随机存取存储器。 ASP.NET 运行时包括称为缓存的 CLR 对象的键值映射。这驻留在应用程序中,可通过 HttpContext 和 System.Web.UI.Page 使用。
在某些方面,缓存类似于存储状态对象。但是,状态对象中的存储信息是确定性的,即您可以依赖存储在那里的数据,而数据的缓存是不确定的。
在以下情况下数据将不可用:
如果它的生命周期到期, 如果应用程序释放其内存, 如果由于某种原因没有进行缓存。
您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生命周期,并在缓存对象与其物理源之间建立链接。

在 ASP.Net 中缓存

ASP.NET 提供以下不同类型的缓存:
输出缓存:输出缓存存储最终呈现的 HTML 页面或发送到客户端的部分页面的副本。当下一个客户端请求此页面时,不会重新生成页面,而是发送页面的缓存副本,从而节省时间。 数据缓存:数据缓存是指从数据源缓存数据。只要缓存未过期,就会从缓存中满足对数据的请求。当缓存过期时,数据源会获取新数据并重新填充缓存。 对象缓存 :对象缓存是缓存页面上的对象,例如数据绑定控件。缓存数据存储在服务器内存中。 类缓存 :第一次运行时,网页或网络服务被编译成程序集中的页面类。然后程序集缓存在服务器中。下次对页面或服务发出请求时,将引用缓存的程序集。更改源代码后,CLR 会重新编译程序集。 配置缓存:应用程序范围的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。
在本教程中,我们将考虑输出缓存、数据缓存和对象缓存。

输出缓存

渲染页面可能涉及一些复杂的过程,例如数据库访问、渲染复杂控件等。输出缓存允许通过在内存中缓存数据来绕过到服务器的往返。甚至整个页面都可以缓存。
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 指令具有以下属性,有助于控制输出缓存的行为:
属性 说明
DiskCacheable true/false 指定可以将输出写入基于磁盘的缓存。
NoStore true/false 指定是否发送"no store"缓存控制头。
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 根据文本框中的名称缓存页面。

数据缓存

数据缓存的主要方面是缓存数据源控件。我们已经讨论过数据源控件表示数据源中的数据,例如数据库或 XML 文件。这些控件派生自抽象类 DataSourceControl 并具有以下用于实现缓存的继承属性:
CacheDuration-设置数据源缓存数据的秒数。 CacheExpirationPolicy-定义缓存中的数据过期时的缓存行为。 CacheKeyDependency-它为控件标识一个键,在删除时自动过期其缓存内容。 EnableCaching-指定是否缓存数据。

示例

要演示数据缓存,请创建一个新网站并在其上添加一个新的网络表单。使用数据访问教程中已经使用的数据库连接添加 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());
}
设计的页面应如下所示:
数据缓存
当您第一次执行页面时,没有什么不同,标签显示,每次刷新页面时,页面都会重新加载,并且标签上显示的时间会发生变化。
接下来,将数据源控件的 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>

对象缓存

对象缓存提供了比其他缓存技术更大的灵活性。您可以使用对象缓存将任何对象放入缓存中。对象可以是任何类型-数据类型、Web 控件、类、数据集对象等。只需分配新的键名即可将项目添加到缓存中,如下所示:
Cache["key"] = item;
ASP.NET 还提供了用于将对象插入缓存的 Insert() 方法。此方法有四个重载版本。让我们看看它们:
过载 说明
Cache.Insert((key, value); 使用具有默认优先级和过期时间的键名和值将项插入缓存。
Cache.Insert(key, value, dependencies); 使用键、值、默认优先级、过期时间和链接到其他文件或项目的 CacheDependency 名称将项目插入缓存,以便在这些更改时缓存项目不再有效。
Cache.Insert(key、value、dependencies、absoluteExpiration、slidingExpiration); 这表示到期政策以及上述问题。
Cache.Insert(key、value、dependencies、absoluteExpiration、slidingExpiration、priority、onRemoveCallback); 这与参数一起还允许您为缓存项和一个委托设置优先级,该委托指向要在删除项时调用的方法。
滑动过期用于在指定的时间跨度内从缓存中删除项目。以下代码片段存储了一个 10 分钟滑动到期且没有依赖项的项目。
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));

示例

创建一个只有一个按钮和一个标签的页面。在页面加载事件中编写如下代码:
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
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4