ASP.NET 数据缓存
缓存是一种将经常使用的数据/信息存储在内存中的技术,以便下次需要相同的数据/信息时,可以直接从内存中检索,而不是由应用程序生成。
缓存对于 ASP.NET 中的性能提升非常重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务尤其重要,因为这些事务在响应时间方面很昂贵。
缓存将经常使用的数据放置在快速访问的媒体中,例如计算机的随机存取存储器。 ASP.NET 运行时包含一个名为缓存的 CLR 对象的键值映射。这驻留在应用程序中,可通过 HttpContext 和 System.Web.UI.Page 获得。
在某些方面,缓存类似于存储状态对象。但是,状态对象中的存储信息是确定性的,也就是说,你可以指望存储在那里的数据,而数据的缓存是不确定的。
在以下情况下,数据将不可用:
- 如果它的寿命到期,
- 如果应用程序释放它的内存,
- 如果由于某种原因没有进行缓存。
你可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生命周期,并在缓存对象与其物理源之间建立链接。
ASP.Net 中的缓存
ASP.NET 提供以下不同类型的缓存:
-
输出缓存 :输出缓存存储最终呈现的 HTML 页面的副本或发送给客户端的部分页面。当下一个客户端请求该页面时,不会重新生成该页面,而是发送该页面的缓存副本,从而节省时间。
-
数据缓存 :数据缓存是指缓存来自数据源的数据。只要缓存没有过期,就会从缓存中完成对数据的请求。当缓存过期时,数据源获取新数据并重新填充缓存。
-
Object Caching :对象缓存是缓存页面上的对象,例如数据绑定控件。缓存的数据存储在服务器内存中。
-
类缓存 :第一次运行时,Web 页面或 Web 服务在程序集中编译为页面类。然后程序集被缓存在服务器中。下次对页面或服务发出请求时,将引用缓存的程序集。当源代码更改时,CLR 重新编译程序集。
-
配置缓存 :应用程序范围的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。
在本教程中,我们将考虑输出缓存、数据缓存和对象缓存。
输出缓存
渲染页面可能涉及一些复杂的过程,例如数据库访问、渲染复杂控件等。输出缓存允许通过在内存中缓存数据来绕过到服务器的往返。甚至整个页面都可以被缓存。
输出Cache 指令负责输出缓存。它启用输出缓存并对其行为提供一定的控制。
输出Cache 指令的语法:
<%@ 输出Cache 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()); }
The 线程.睡眠() 方法将进程线程停止指定的时间。在本例中,线程停止了 10 秒,因此第一次加载页面时,需要 10 秒。但是,下次刷新页面时不会花费任何时间,因为页面是从缓存中检索的,而没有加载。
输出Cache 指令具有以下属性,有助于控制输出缓存的行为:
属性 | Values | 描述 |
---|---|---|
DiskCacheable | 真假 | 指定可以将输出写入基于磁盘的缓存。 |
NoStore | 真假 | 指定是否发送“no store”缓存控制标头。 |
缓存配置文件 | String name | 要存储在 web.config 中的缓存配置文件的名称。 |
随参数变化 |
None * 参数名称 |
分号分隔的字符串列表指定 GET 请求中的查询字符串值或 POST 请求中的变量。 |
VaryByHeader |
* 标题名称 |
分号分隔的字符串列表指定客户端可能提交的标头。 |
因定制而异 |
Browser 自定义字符串 |
告诉 ASP.NET 通过浏览器名称和版本或自定义字符串来改变输出缓存。 |
Location |
Any Client 下游 Server None |
Any:页面可以缓存在任何地方。 客户端:缓存的内容保留在浏览器中。 下游:存储在下游和服务器中的缓存内容。 服务器:缓存内容仅保存在服务器上。 无:禁用缓存。 |
Duration | Number | 页面或控件被缓存的秒数。 |
让我们在前面的示例中添加一个文本框和一个按钮,并为该按钮添加这个事件处理程序。
protected void btnmagic_Click(object sender, EventArgs e) { Response.Write("<br><br>"); Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>"); }
更改 输出Cache 指令:
<%@ 输出Cache Duration="60" VaryByParam="txtname" %>
程序执行时,ASP.NET 根据文本框中的名称缓存页面。
数据缓存
数据缓存的主要方面是缓存数据源控件。我们已经讨论过数据源控件表示数据源中的数据,例如数据库或 XML 文件。这些控件派生自抽象类 DataSourceControl 并具有以下用于实现缓存的继承属性:
-
缓存持续时间 - 它设置数据源将缓存数据的秒数。
-
缓存过期策略 - 它定义了缓存中的数据过期时的缓存行为。
-
CacheKeyDependency - 它为控件标识一个键,该键在删除时自动过期其缓存的内容。
-
启用缓存 - 它指定是否缓存数据。
例子
为了演示数据缓存,请创建一个新网站并在其上添加一个新的 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: ASPDotNet步骤By步骤ConnectionString %>" ProviderName = "<%$ ConnectionStrings: ASPDotNet步骤By步骤ConnectionString.ProviderName %>" SelectCommand = "SELECT * FROM [DotNetReferences]" EnableCaching = "true" CacheDuration = "60"> </asp:SqlDataSource>
Object Caching
Object caching provides more flexibility than other cache techniques. You can use object caching to place any object in the cache. The object can be of any type - a data type, a web control, a class, a dataset object, etc. The item is added to the cache simply by assigning a new key name, shown as follows Like:
Cache["key"] = item;
ASP.NET 还提供了用于将对象插入缓存的 Insert() 方法。此方法有四个重载版本。让我们看看它们:
Overload | 描述 |
---|---|
缓存.插入((键,值); | 使用具有默认优先级和过期时间的键名和值将项目插入缓存。 |
Cache.Insert(key, value, dependencies); | 使用键、值、默认优先级、过期时间和链接到其他文件或项目的 CacheDependency 名称将项目插入缓存,以便在这些更改时缓存项目不再有效。 |
Cache.Insert(键,值,依赖,absoluteExpiration,slidingExpiration); | 这表明到期策略以及上述问题。 |
Cache.Insert(键,值,依赖项,absoluteExpiration,slidingExpiration,优先级,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输出Cache 指令的语法:04