返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

ASP.NET-数据缓存

时间:2020-01-16 16:24来源:知行网www.zhixing123.cn 编辑:麦田守望者

 

什么是缓存?

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

缓存对于ASP.NET中的性能提升极为重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务特别重要,因为这些事务的响应时间很昂贵。

高速缓存会将常用数据放置在快速访问的介质中,例如计算机的随机访问存储器。ASP.NET运行时包含CLR对象的键-值映射,称为高速缓存。它驻留在应用程序中,可以通过HttpContext和System.Web.UI.Page使用。

在某些方面,缓存类似于存储状态对象。但是,在状态对象中存储信息是确定性的,即,您可以依靠在那里存储的数据,而数据的缓存是不确定性的。

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

  • 如果生命周期到期,
  • 如果应用程序释放其内存,
  • 如果由于某种原因未进行缓存。

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

在ASP.Net中缓存

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

  • 输出缓存:输出缓存存储最终呈现的HTML页面或发送给客户端的部分页面的副本。当下一个客户端请求此页面时,无需重新生成页面,而是发送页面的缓存副本,从而节省了时间。

  • 数据缓存:数据缓存是指从数据源缓存数据。只要缓存没有过期,就将从缓存中满足对数据的请求。当缓存过期时,数据源将获取新数据,并重新填充缓存。

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

  • 类缓存:首次运行时,网页或Web服务将在程序集中的页面类中编译。然后,程序集被缓存在服务器中。下次请求页面或服务时,将引用缓存的程序集。更改源代码后,CLR将重新编译程序集。

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

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

输出缓存

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

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

OutputCache指令的语法:

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

将此指令放在page指令下。这告诉环境将页面缓存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指令具有以下属性,有助于控制输出缓存的行为:

属性 价值观 描述
磁盘可缓存 真假 指定可以将输出写入基于磁盘的缓存。
NoStore 真假 指定是否发送“不存储”缓存控制标头。
CacheProfile 字串名称 要存储在web.config中的缓存配置文件的名称。
VaryByParam

没有

*

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

*

标头名称

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

浏览器

自定义字符串

告诉ASP.NET根据浏览器名称和版本或自定义字符串来更改输出缓存。
位置

任何

客户

下游

服务器

没有

任何:页面可能被缓存在任何地方。

客户端:缓存的内容保留在浏览器中。

下游:存储在下游和服务器中的缓存内容。

服务器:仅在服务器上保存的缓存内容。

无:禁用缓存。

持续时间 页面或控件被缓存的秒数。

让我们在前面的示例中添加一个文本框和一个按钮,然后为按钮添加此事件处理程序。

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(键,值,依赖项); 将具有键,值,默认优先级,到期时间和链接到其他文件或项目的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秒内再次单击该按钮,该页面将被发布回去,但label控件将从缓存中获取其信息,如下所示:

Page Posted Back.
Retrieving test item.
Test item is: 14-07-2010 01:25:04
------分隔线----------------------------
标签(Tag):
------分隔线----------------------------
推荐内容
  • ASP.NET-Web服务

    Web服务是一种基于Web的功能,使用要由Web应用程序使用的Web协议进行访问。 Web服务开...

  • ASP.NET-数据缓存

    什么是缓存? 缓存是一种将经常使用的数据/信息存储在内存中的技术,因此,当下次需要...

  • ASP.NET-安全

    在站点中实现安全性具有以下方面: 认证 :这是确保用户身份和真实性的过程。 ASP.NET...

  • ASP.NET-LINQ

    大多数应用程序都以数据为中心,但是大多数数据存储库都是关系数据库。 多年来,设计...

  • ASP.NET-调试

    通过调试,开发人员可以逐步查看代码的工作方式,变量的值如何更改,对象的创建和销毁...

  • ASP.NET-错误处理

    ASP.NET中的错误处理包括三个方面: 跟踪 -在页面级别或应用程序级别跟踪程序执行。 ...

猜你感兴趣