65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET中的缓存

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.22/5 (13投票s)

2004年9月17日

3分钟阅读

viewsIcon

79391

ASP.NET 中的页面缓存。我们可以使用缓存来提高网页的性能,并减少服务器请求流量。提高吞吐量的方法是在网页中使用缓存。

引言

缓存是 ASP.NET 中的一项功能,当我们从传统的 ASP 过渡到 ASP.NET 时,这项功能得到了很大的改进。缓存有助于提高网页的效率和速度。您可以在 ASP.NET 中做很多事情,这将以 .NET 中快速应用程序的形式清晰地显示出来。.NET 中的页面缓存得到了高度改进,并具有高级功能,例如将缓存项与其依赖项相关联。ASP.NET 具有多种支持缓存的工具:用于存储任意数据的缓存 API,以及用于存储经常请求的页面的输出缓存。以下是一篇简短的文章,向您快速介绍如何在 ASP.NET 中使用缓存 API。

我们可以将数据存储在 Page.Cache 中,而不是将数据作为键/值对存储在 ApplicationSession 集合中。它的功能在概念上类似 - 代表应用程序存储名称/值对。然而,当您查看 ApplicationPage.CacheAdd 函数的参数列表时,差异就会显现出来。除了名称/键和值参数之外,Page.Cache.Add 还有以下参数

  • dependencies – 一个 CacheDependency 对象,指示此缓存条目的数据所依赖的内容。
  • absoluteExpiration – 一个 DateTime,指示此缓存条目中的数据应被视为无效的绝对日期和时间 (DateTime.MaxValue 禁用此功能)。
  • slidingExpiration – 一个 TimeSpan,指示自上次使用以来经过的时间,该时间将使缓存条目失效 (TimeSpan.Zero 禁用此功能,不能与 absoluteExpiration 一起使用)。
  • priorityCacheItemPriority 枚举,指示此项在 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

上面提到的代码类似于在 ApplicationSession 对象中存储变量。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" %>
© . All rights reserved.