📅  最后修改于: 2020-11-21 05:56:26             🧑  作者: Mango
缓存是一种将频繁使用的数据/信息存储在内存中的技术,因此,当下次需要相同的数据/信息时,可以直接从内存中检索它,而不必由应用程序生成。
缓存对于ASP.NET中的性能提升极为重要,因为页面和控件是在此处动态生成的。这对于与数据相关的事务尤为重要,因为这些事务的响应时间很昂贵。
高速缓存会将常用数据放置在快速访问的介质中,例如计算机的随机访问存储器。 ASP.NET运行时包含CLR对象的键-值映射,称为高速缓存。它驻留在应用程序中,可以通过HttpContext和System.Web.UI.Page使用。
在某些方面,缓存类似于存储状态对象。但是,在状态对象中存储信息是确定性的,即,您可以依靠在那里存储的数据,而数据的缓存是不确定性的。
在以下情况下,数据将不可用:
您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生存期,并可以在缓存的对象及其物理源之间建立链接。
ASP.NET提供以下不同类型的缓存:
输出缓存:输出缓存存储最终呈现的HTML页面或发送给客户端的部分页面的副本。当下一个客户端请求此页面时,无需重新生成页面,而是发送页面的缓存副本,从而节省了时间。
数据缓存:数据缓存是指从数据源缓存数据。只要缓存没有过期,就将从缓存中满足对数据的请求。当缓存过期时,数据源将获取新数据,并重新填充缓存。
对象缓存:对象缓存是在页面上缓存对象,例如数据绑定控件。缓存的数据存储在服务器内存中。
类缓存:首次运行时,网页或Web服务会在程序集中的页面类中编译。然后,程序集被缓存在服务器中。下次请求页面或服务时,将引用缓存的程序集。更改源代码后,CLR将重新编译程序集。
配置缓存:应用程序范围的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。
在本教程中,我们将考虑输出缓存,数据缓存和对象缓存。
呈现页面可能涉及一些复杂的过程,例如数据库访问,呈现复杂的控件等。输出缓存允许通过将数据缓存在内存中来绕过服务器的往返行程。甚至整个页面都可以被缓存。
OutputCache指令负责输出缓存。它启用了输出缓存并对其行为提供了一定的控制。
OutputCache指令的语法:
将此指令放在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指令具有以下属性,有助于控制输出缓存的行为:
Attribute | Values | Description |
---|---|---|
DiskCacheable | true/false | Specifies that output could be written to a disk based cache. |
NoStore | true/false | Specifies that the “no store” cache control header is sent or not. |
CacheProfile | String name | Name of a cache profile as to be stored in web.config. |
VaryByParam |
None * Param- name |
Semicolon delimited list of string specifies query string values in a GET request or variable in a POST request. |
VaryByHeader |
* Header names |
Semicolon delimited list of strings specifies headers that might be submitted by a client. |
VaryByCustom |
Browser Custom string |
Tells ASP.NET to vary the output cache by browser name and version or by a custom string. |
Location |
Any Client Downstream Server None |
Any: page may be cached anywhere. Client: cached content remains at browser. Downstream: cached content stored in downstream and server both. Server: cached content saved only on server. None: disables caching. |
Duration | Number | Number of seconds the page or control is cached. |
让我们在前面的示例中添加一个文本框和一个按钮,并为按钮添加此事件处理程序。
protected void btnmagic_Click(object sender, EventArgs e)
{
Response.Write("
");
Response.Write(" Hello, " + this.txtname.Text + "
");
}
更改OutputCache指令:
执行该程序时,ASP.NET会根据文本框中的名称缓存页面。
数据缓存的主要方面是缓存数据源控件。我们已经讨论过,数据源控件表示数据源中的数据,例如数据库或XML文件。这些控件派生自抽象类DataSourceControl,并具有以下继承的属性以实现缓存:
CacheDuration-设置数据源缓存数据的秒数。
CacheExpirationPolicy-定义缓存中的数据过期时的缓存行为。
CacheKeyDependency-标识控件的键,该键在删除时会自动使缓存内容过期。
EnableCaching-指定是否缓存数据。
为了演示数据缓存,请创建一个新网站并在其上添加新的Web表单。使用数据访问教程中已使用的数据库连接添加SqlDataSource控件。
对于此示例,在页面上添加标签,该标签将显示页面的响应时间。
除了标签之外,内容页面与数据访问教程中的相同。为页面加载事件添加事件处理程序:
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秒钟内更改表中的数据,则在缓存到期之前不会显示该时间戳。
与其他缓存技术相比,对象缓存提供了更大的灵活性。您可以使用对象缓存将任何对象放入缓存中。该对象可以是任何类型-数据类型,Web控件,类,数据集对象等。只需分配新的键名即可将该项目添加到缓存中,如下所示:
Cache["key"] = item;
ASP.NET还提供用于将对象插入到缓存的Insert()方法。此方法有四个重载版本。让我们看看他们:
Overload | Description |
---|---|
Cache.Insert((key, value); | Inserts an item into the cache with the key name and value with default priority and expiration. |
Cache.Insert(key, value, dependencies); | Inserts an item into the cache with key, value, default priority, expiration and a CacheDependency name that links to other files or items so that when these change the cache item remains no longer valid. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | This indicates an expiration policy along with the above issues. |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | This along with the parameters also allows you to set a priority for the cache item and a delegate that, points to a method to be invoked when the item is removed. |
当在指定的时间段内未使用项目时,滑动到期用于从缓存中删除该项目。以下代码段存储一个滑动期为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.
";
}
else
{
lblinfo.Text += "page Created.
";
}
if (Cache["testitem"] == null)
{
lblinfo.Text += "Creating test item.
";
DateTime testItem = DateTime.Now;
lblinfo.Text += "Storing test item in cache ";
lblinfo.Text += "for 30 seconds.
";
Cache.Insert("testitem", testItem, null,
DateTime.Now.AddSeconds(30), TimeSpan.Zero);
}
else
{
lblinfo.Text += "Retrieving test item.
";
DateTime testItem = (DateTime)Cache["testitem"];
lblinfo.Text += "Test item is: " + testItem.ToString();
lblinfo.Text += "
";
}
lblinfo.Text += "
";
}
首次加载页面时,它说:
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