caching与缓存

一般,应用程序能够将那些频繁访问的数据,以及那些须要大量处理时间来建立的数据存储在内存中,从而提升性能。例如,若是应用程序使用复杂的逻辑来处理大量数据,而后再将数据做为用户频繁访问的报表返回,避免在用户每次请求数据时从新建立报表能够提升效率。一样,若是应用程序包含一个处理复杂数据但不须要常常更新的页,则在每次请求时服务器都从新建立该页会使工做效率低下。 web

在这些状况下,为了帮助您提升应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。第一种机制是应用程序缓存,它容许您缓存所生成的数据,如 DataSet 或自定义报表业务对象。第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。 sql

应用程序缓存数据库

应用程序缓存提供了一种编程方式,可经过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态相似。可是,与应用程序状态不一样的是,应用程序缓存中的数据是易失的,即数据并非在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优势是由 ASP.NET 管理缓存,它会在项过时、无效、或内存不足时移除缓存中的项。还能够配置应用程序缓存,以便在移除项时通知应用程序。有关更多信息,请参见缓存应用程序数据编程

使用应用程序缓存的模式是,肯定在访问某一项时该项是否存在于缓存中,若是存在,则使用。若是该项不存在,则能够从新建立该项,而后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。 缓存

页输出缓存服务器

页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制容许 ASP.NET 向客户端发送页响应,而没必要再次通过页处理生命周期。页输出缓存对于那些不常常更改,但须要大量处理才能建立的页特别有用。例如,若是建立大通讯量的网页来显示不须要频繁更新的数据,页输出缓存则能够极大地提升该页的性能。能够分别为每一个页配置页缓存,也能够在 Web.config 文件中建立缓存配置文件。利用缓存配置文件,只定义一次缓存设置就能够在多个页中使用这些设置。 框架

页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存容许将页的所有内容保存在内存中,并用于完成客户端请求。部分页缓存容许缓存页的部份内容,其余部分则为动态内容。有关更多信息,请参见缓存 ASP.NET 页性能

部分页缓存可采用两种工做方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式容许将信息包含在一个用户控件内,而后将该用户控件标记为可缓存的,以此来缓存页输出的部份内容。这一方式可缓存页中的特定内容,并不缓存整个页,所以每次都需从新建立整个页。例如,若是要建立一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时能够将静态部分放在用户控件中,并容许缓存这些内容。 网站

缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,若是要建立一个在规定时间段内为静态的页,则能够将整个页设置为进行缓存。若是向页添加一个显示用户名的 Label 控件,则对于每次页刷新和每一个用户而言,Label 的内容都将保持不变,始终显示缓存该页以前请求该页的用户的姓名。可是,使用缓存后替换机制,能够将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此状况下,能够向不可缓存部分添加 Label 控件,这样将为每一个用户和每次页请求动态建立这些控件。有关更多信息,请参见 缓存 ASP.NET 页的某些部分ui

根据请求参数缓存页

除缓存页的单一版本外,ASP.NET 页输出缓存还提供了一些功能,能够建立根据请求参数的不一样而不一样的页的多个版本。有关更多信息,请参见 缓存页的多个版本

自动移除数据

出于如下缘由之一,ASP.NET 能够从缓存中移除数据:

  • 因为服务器上的内存不足,开始一个称为"清理"的过程。
  • 因为缓存中的项已过时。
  • 因为项的依赖项发生了更改。

为了帮助管理缓存项,在将项从缓存中移除时,ASP.NET 会通知应用程序。

清理

清理是在内存不足时从缓存中删除项的过程。若是某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除。ASP.NET 使用 CacheItemPriority 对象来肯定要首先清理的项。有关更多信息,请参见如何:将项添加到缓存中

过时

除了清理外,在缓存项过时时,ASP.NET 会自动从缓存中移除这些项。向缓存添加项时,能够按下表中的描述设置其过时时间。

过时类型

说明

可调过时

指定某项自上次被访问后多长时间过时。例如,能够将某项设置为自上次在缓存中被访问后 20 分钟过时。

绝对过时

指定某项在设定的时间过时,而不考虑访问频率。例如,能够将某项设置为在 6:00 PM 过时,或四小时后过时。

   

   

依赖项

能够将缓存中某一项的生存期配置为依赖于其余应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET 将从缓存中移除该项。例如,若是您的网站显示一份报告,该报告是应用程序经过 XML 文件建立的,您能够将该报告放置在缓存中,并将其配置为依赖于该 XML 文件。当 XML 文件更改时,ASP.NET 会从缓存中移除该报告。当代码请求该报告时,代码会先肯定该报告是否在缓存中,若是不在,代码会从新建立该报告。所以,始终都有最新版本的报告可用。

ASP.NET 缓存支持下表中描述的依赖项。

依赖项

说明

键依赖项

应用程序缓存中的项存储在键/值对中。键依赖项容许项依赖于应用程序缓存中另外一项的键。若是移除了原始项,则具备键依赖关系的项也会被移除。例如,能够添加一个名为 ReportsValid 的缓存项,而后缓存若干个依赖于 ReportsValid 键的报告。当ReportsValid 项被移除时,全部依赖于它的缓存报告一样也会从缓存中移除。

文件依赖项

缓存中的项依赖于外部文件。若是该文件被修改或删除,则缓存项也会被移除。

SQL 依赖项

缓存中的项依赖于 Microsoft SQL Server 200五、SQL Server 2000 或 SQL Server 7.0 数据库中表的更改。对于 SQL Server 2005,缓存中的项可依赖于表中的某一行。有关更多信息,请参见 使用 SqlCacheDependency 类在 ASP.NET 中缓存

聚合依赖项

经过使用 AggregateCacheDependency 类缓存中的项依赖于多个元素。若是任何依赖项发生更改,该项都会从缓存中移除。

自定义依赖项

能够用您本身的代码建立的依赖关系来配置缓存中的项。例如,能够建立一个自定义 Web 服务缓存依赖项,当调用 Web 服务获得一个特定值时,该依赖项就会从缓存中移除数据。

   

   

应用程序缓存项移除通知

当项从应用程序缓存中移除时,您能够收到通知。例如,若是有一个须要大量处理时间才能建立的项,当从缓存中移除该项时,您会收到通知以即可以当即替换该项。这样,下次请求该项时,用户便没必要等待处理该项。有关更多信息,请参见如何:从缓存中移除项时通知应用程序

   

在ASP.NET MVC中,Cache可从HttpContext访问,它是System.Web.Cache的一个实例,目前公司框架中在Web应用时的缓存也是使用这个Cache类

   

缓存添加

Cache["CacheItem1"] = "Cached Item 1";

Cache.Insert("CacheItem2", "Cached Item 2");

//CacheedItem9的值为"Cached Item 9"

string CachedItem9 = (string)Cache.Add("CacheItem9",

"Cached Item 9", null,

System.Web.Caching.Cache.NoAbsoluteExpiration,

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.Default,

null);  

经过指定依赖项向缓存添加项

string[] dependencies = { "CacheItem2" };

Cache.Insert("CacheItem3", "Cached Item 3",

new System.Web.Caching.CacheDependency(null, dependencies));

   

Cache.Insert("CacheItem4", "Cached Item 4",

new System.Web.Caching.CacheDependency(

Server.MapPath("XMLFile.xml"))); 

添加多个依赖项

System.Web.Caching.CacheDependency dep1 =

new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));

string[] keyDependencies2 = { "CacheItem1" };

System.Web.Caching.CacheDependency dep2 =

new System.Web.Caching.CacheDependency(null, keyDependencies2);

System.Web.Caching.AggregateCacheDependency aggDep =

new System.Web.Caching.AggregateCacheDependency();

aggDep.Add(dep1);

aggDep.Add(dep2);

Cache.Insert("CacheItem5", "Cached Item 5", aggDep);

 

 

将设有过时策略的项添加到缓存中

//下面的代码示例将有一分钟绝对过时时间的项添加到缓存中:即缓存会在插入后一分钟过时

Cache.Insert("CacheItem6", "Cached Item 6",

null, DateTime.Now.AddMinutes(1d),

System.Web.Caching.Cache.NoSlidingExpiration);
//下面的代码示例将有 10 分钟弹性过时时间的项添加到缓存中:即缓存会最后一次访问的10分钟后过时,如每在10分钟内都访问一次,缓存则不会过时。

Cache.Insert("CacheItem7", "Cached Item 7",

null, System.Web.Caching.Cache.NoAbsoluteExpiration,

new TimeSpan(0, 10, 0));

 

将设有优先级设置的项添加到缓存中

//下面的代码示例将优先级值为 High 的项添加到缓存中:

Cache.Insert("CacheItem8", "Cached Item 8",

null, System.Web.Caching.Cache.NoAbsoluteExpiration,

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.High, null);   

要从缓存中检索数据,应指定存储缓存项的键。不过,因为缓存中所存储的信息为易失信息,即该信息可能由 ASP.NET 移除,所以建议的开发模式是首先肯定该项是否在缓存中。若是不在,则应将它从新添加到缓存中,而后检索该项。

   

检索缓存项的值  

string cachedString;

cachedString = (string)Cache["CacheItem"];

if (cachedString == null)

{

cachedString = "Hello, World.";

Cache.Insert("CacheItem", cachedString);

}

 

ASP.NET 缓存中的数据是易失的,即不能永久保存。因为如下任一缘由,缓存中的数据可能会自动移除:

  • 缓存已满。
  • 该项已过时。
  • 依赖项发生更改。

   

从缓存中显式删除项

Cache.Remove("MyData1");   

从缓存中移除项时通知应用程序

//在Add方法中添加有个参数是传入一个CacheItemRemovedCallback的委托,这个委托在缓存被清理时调用,

Cache.Add("MyReport",

CreateReport(), null, DateTime.MaxValue,

new TimeSpan(0, 1, 0),

System.Web.Caching.CacheItemPriority.Default,

ReportRemovedCallback);   

委托的定义以下,CacheItemRemovedReason是一个枚举,传递缓存被移除的缘由,

public delegate void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason);

 

在Web.Config中,对缓存设置以下

<caching>

<!--定义全局应用程序缓存设置。-->

<cache

<!-- 是否当计算机处于内存压力下时是否禁止执行缓存内存回收。-->

disableMemoryCollection = "false"

<!--是否禁用缓存过时。若是禁用,则缓存项不会过时,而且不会对过时缓存项执行后台清理。

-->

disableExpiration = "false"

<!--指示在缓存开始刷新过时项并尝试回收内存以前应用程序的最大专用字节大小。此限制同时包括缓存所使用的内存量以及运行应用程序的正常内存开销。若是设置为零,则指示 ASP.NET 将使用本身的试探法肯定什么时候开始回收内存。

-->

privateBytesLimit = "0"

<!--指示在缓存开始刷新过时项并尝试回收内存以前应用程序可以使用的最大计算机物理内存百分比。该内存使用率同时包括缓存使用的内存以及正运行的应用程序的正常内存使用率。若是设置为零,则指示 ASP.NET 将使用本身的试探法肯定什么时候开始回收内存。-->

percentagePhysicalMemoryUsedLimit = "90"

<!--指示两次轮询应用程序专用字节内存使用量之间的时间间隔。

-->

privateBytesPollTime = "00:02:00"/>

   

<outputCache enableOutputCache = "true"

enableFragmentCache = "true"

sendCacheControlHeader = "true"

omitVaryStar = "false" >

</outputCache><!--指定应用程序范围的输出缓存设置。-->

   

<outputCacheSettings>

<outputCacheProfiles>

<add name = ""

enabled = "true"

duration = "-1"

location = ""

sqlDependency = ""

varyByCustom = ""

varyByControl = ""

varyByHeader = ""

varyByParam = ""

noStore = "false"/>

</outputCacheProfiles>

</outputCacheSettings><!--指定能够应用于应用程序中页的输出缓存设置。-->

   

<outputCacheSettings>

<outputCacheProfiles>

<clear />

</outputCacheProfiles>

</outputCacheSettings>

   

<sqlCacheDependency enabled = "true"

pollTime = "60000">

<databases>

<add name = ""

connectionStringName = ""

pollTime = "60000"/>

</databases>

</sqlCacheDependency><!--为 ASP.NET 应用程序配置 SQL 缓存依赖项。-->

   

</caching>

 

针对上面以介绍应用程序缓存为主。只有cache节点对其有影响。

相关文章
相关标签/搜索