什么是缓存?缓存是一种将经常使用的数据/信息存储在内存中的技术,因此,当下次需要相同的数据/信息时,可以直接从内存中检索它,而不必由应用程序生成。 缓存对于ASP.NET中的性能提升极为重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务特别重要,因为这些事务的响应时间很昂贵。 高速缓存会将常用数据放置在快速访问的介质中,例如计算机的随机访问存储器。ASP.NET运行时包含CLR对象的键-值映射,称为高速缓存。它驻留在应用程序中,可以通过HttpContext和System.Web.UI.Page使用。 在某些方面,缓存类似于存储状态对象。但是,在状态对象中存储信息是确定性的,即,您可以依靠在那里存储的数据,而数据的缓存是不确定性的。 在以下情况下,数据将不可用:
您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生存期,并可以在缓存的对象及其物理源之间建立链接。 在ASP.Net中缓存ASP.NET提供以下不同类型的缓存:
在本教程中,我们将考虑输出缓存,数据缓存和对象缓存。 输出缓存呈现页面可能涉及一些复杂的过程,例如数据库访问,呈现复杂的控件等。输出缓存允许通过将数据缓存在内存中来绕过服务器的往返行程。甚至整个页面都可以被缓存。 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指令具有以下属性,有助于控制输出缓存的行为:
让我们在前面的示例中添加一个文本框和一个按钮,然后为按钮添加此事件处理程序。 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,并具有以下继承的属性,用于实现缓存:
例为了演示数据缓存,请创建一个新网站并在其上添加新的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()方法。此方法有四个重载版本。让我们看看他们:
当在指定的时间段内未使用项目时,滑动到期用于从缓存中删除该项目。以下代码段存储了一个滑动期为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 |