ASP.NET中的缓存






1.22/5 (13投票s)
2004年9月17日
3分钟阅读

79391
ASP.NET 中的页面缓存。我们可以使用缓存来提高网页的性能,并减少服务器请求流量。提高吞吐量的方法是在网页中使用缓存。
引言
缓存是 ASP.NET 中的一项功能,当我们从传统的 ASP 过渡到 ASP.NET 时,这项功能得到了很大的改进。缓存有助于提高网页的效率和速度。您可以在 ASP.NET 中做很多事情,这将以 .NET 中快速应用程序的形式清晰地显示出来。.NET 中的页面缓存得到了高度改进,并具有高级功能,例如将缓存项与其依赖项相关联。ASP.NET 具有多种支持缓存的工具:用于存储任意数据的缓存 API,以及用于存储经常请求的页面的输出缓存。以下是一篇简短的文章,向您快速介绍如何在 ASP.NET 中使用缓存 API。
我们可以将数据存储在 Page.Cache
中,而不是将数据作为键/值对存储在 Application
或 Session
集合中。它的功能在概念上类似 - 代表应用程序存储名称/值对。然而,当您查看 Application
和 Page.Cache
的 Add
函数的参数列表时,差异就会显现出来。除了名称/键和值参数之外,Page.Cache.Add
还有以下参数
dependencies
– 一个CacheDependency
对象,指示此缓存条目的数据所依赖的内容。absoluteExpiration
– 一个DateTime
,指示此缓存条目中的数据应被视为无效的绝对日期和时间 (DateTime.MaxValue
禁用此功能)。slidingExpiration
– 一个TimeSpan
,指示自上次使用以来经过的时间,该时间将使缓存条目失效 (TimeSpan.Zero
禁用此功能,不能与absoluteExpiration
一起使用)。priority
–CacheItemPriority
枚举,指示此项在 ASP.NET 缓存中的优先级。onRemoveCallback
– 一个回调函数,使应用程序能够在从缓存中删除数据时采取操作。
为了简单地利用缓存,我们可以简单地将一个 DataSet
存储到缓存中。这将提高页面执行的速度,因为每次都不会对数据库进行查询以获取 DataSet
。我们只需在将 DataSet
存储到缓存变量中之前进行检查,该缓存变量仅在 DataSet
尚未保存在缓存中时才会获取 DataSet
。
if(!IsPostBack)
Cache["ProductData"]=GetDataSet();
//GetDataSet() is a function which returns a dataset
//which is to be stored in Cache
上面提到的代码类似于在 Application
或 Session
对象中存储变量。ASP.NET 中缓存的真正好处在于使用其特殊功能,例如对文件、键和时间的“缓存依赖项”。以下示例解释了它的用法。
基于文件的依赖项会在磁盘上的文件更改时使特定的 Cache 项失效。例如,如果我们不是从数据库加载产品数据,而是从 XML 文件加载
XmlDocument xd = new XmlDocument();
d.Load(Server.MapPath("product.xml");
Cache["ProductData"]=xd;
//Creating Dependencies
CacheDependency depends = new CacheDependency("product.xml");
Cache.Insert("ProductData", xd, depends);
XML 文档 "product.xml" 中的任何更改都将使 Cache["ProductData"]
中的数据失效。
将缓存扩展到页面之外
很明显,页面缓存比 Application
集合提供更多的功能,但范围更有限。我们如何才能利用此功能来处理多个页面使用的数据?幸运的是,可以通过将缓存的数据存储在 Application
集合中来实现这一点,并且仅使用 Page.Cache
来让我们知道依赖项何时更改,使用 onRemoveCallback
。这可以从需要访问数据的所有页面共享的单个类中完成
public static ProductList GetProductList(System.Web.UI.Page page)
{
ProductList productList = (ProductList)page.Application[productListTag];
if (null == productList)
{
productList = new ProductList();
productList.ReadXml(page.Server.MapPath(_productListFile));
Page.Cache.Add(_productListTag,page.Application,
new CacheDependency(Page.Server.MapPath(_productListFile)),
DateTime.MaxValue,
TimeSpan.Zero,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback(RemoveCallback));
Page.Application.Add(_productListTag,productList);
}
return productList;
}
private static void RemoveCallback(string tag, object obj,
CacheItemRemovedReason reason)
{
HttpApplicationState Application = (HttpApplicationState)obj;
if(CacheItemRemovedReason.DependencyChanged == reason)
{
Application.Remove(tag);
}
}
页面输出缓存
页面输出缓存是 ASP.NET 的一项功能,允许将给定页面的全部内容存储在缓存中。如果您想将整个网页存储一段时间,这将很有帮助。当页面数据被频繁查看且页面上的数据不经常更改时,应使用此功能。这可以通过简单地在 .aspx 文件上添加一个指令来完成,如下所示
<%@ OutputCache Duration="10" %>