- ASP.NET 教程
- ASP.NET - 首页
- ASP.NET - 简介
- ASP.NET - 环境
- ASP.NET - 生命周期
- ASP.NET - 第一个例子
- ASP.NET - 事件处理
- ASP.NET - 服务器端
- ASP.NET - 服务器控件
- ASP.NET - HTML 服务器控件
- ASP.NET - 客户端
- ASP.NET - 基本控件
- ASP.NET - 指令
- ASP.NET - 状态管理
- ASP.NET - 验证器
- ASP.NET - 数据库访问
- ASP.NET - ADO.NET
- ASP.NET - 文件上传
- ASP.NET - 广告轮播
- ASP.NET - 日历控件
- ASP.NET - 多视图
- ASP.NET - 面板控件
- ASP.NET - AJAX 控件
- ASP.NET - 数据源
- ASP.NET - 数据绑定
- ASP.NET - 自定义控件
- ASP.NET - 个性化
- ASP.NET - 错误处理
- ASP.NET - 调试
- ASP.NET - LINQ
- ASP.NET - 安全性
- ASP.NET - 数据缓存
- ASP.NET - Web 服务
- ASP.NET - 多线程
- ASP.NET - 配置
- ASP.NET - 部署
- ASP.NET 资源
- ASP.NET - 快速指南
- ASP.NET - 有用资源
- ASP.NET - 讨论
ASP.NET - 数据缓存
什么是缓存?
缓存是一种将常用数据/信息存储在内存中的技术,这样,下次需要相同的数据/信息时,可以直接从内存中检索,而不是由应用程序生成。
缓存对于提高 ASP.NET 的性能至关重要,因为页面和控件在此处是动态生成的。对于与数据相关的交易,它尤其重要,因为这些交易在响应时间方面成本很高。
缓存将常用数据放置在快速访问的介质中,例如计算机的随机存取存储器。ASP.NET 运行时包含一个名为缓存的 CLR 对象的关键值映射。它与应用程序一起驻留,并可通过 HttpContext 和 System.Web.UI.Page 获取。
在某种程度上,缓存类似于存储状态对象。但是,在状态对象中存储信息是确定性的,即您可以依靠存储在那里的数据,而数据的缓存是非确定性的。
在以下情况下,数据将不可用
- 如果其生命周期过期,
- 如果应用程序释放其内存,
- 如果由于某种原因没有进行缓存。
您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生存期,并设置缓存对象与其物理源之间的链接。
ASP.NET 中的缓存
ASP.NET 提供以下几种不同类型的缓存:
输出缓存:输出缓存存储最终呈现的 HTML 页面或发送到客户端的页面部分的副本。当下一个客户端请求此页面时,系统会发送页面的缓存副本,而不是重新生成页面,从而节省时间。
数据缓存:数据缓存是指缓存来自数据源的数据。只要缓存未过期,对数据的请求都将从缓存中满足。当缓存过期时,将从数据源获取新数据,并重新填充缓存。
对象缓存:对象缓存是在页面上缓存对象,例如数据绑定控件。缓存的数据存储在服务器内存中。
类缓存:Web 页面或 Web 服务在第一次运行时编译为程序集中的页面类。然后将程序集缓存到服务器中。下次请求页面或服务时,将引用缓存的程序集。当源代码更改时,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 | 字符串名称 | 要存储在 web.config 中的缓存配置文件的名称。 |
VaryByParam |
None * 参数名称 |
用分号分隔的字符串列表指定 GET 请求中的查询字符串值或 POST 请求中的变量。 |
VaryByHeader |
* 标头名称 |
用分号分隔的字符串列表指定客户端可能提交的标头。 |
VaryByCustom |
浏览器 自定义字符串 |
告诉 ASP.NET 根据浏览器名称和版本或自定义字符串来改变输出缓存。 |
Location |
Any Client Downstream Server None |
Any:页面可以在任何地方缓存。 Client:缓存的内容保留在浏览器中。 Downstream:缓存的内容同时存储在下游和服务器中。 Server:缓存的内容仅保存在服务器上。 None:禁用缓存。 |
Duration | 数字 | 页面或控件缓存的秒数。 |
让我们向之前的示例添加一个文本框和一个按钮,并为按钮添加此事件处理程序。
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 - 它指定是否缓存数据。
示例
为了演示数据缓存,创建一个新的网站并在其上添加一个新的 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()); }
设计的页面应如下所示
当您第一次执行页面时,不会发生任何不同的事情,标签显示每次刷新页面时,页面都会重新加载,并且标签上显示的时间也会发生变化。
接下来,将数据源控件的 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