HttpContext.Current.Cache - 什么时候自动清除?

时间:2011-08-23 10:21:00

标签: .net iis caching

在我的Web表单应用程序中,我使用HttpContext.Current.Cache来存储一些不同表单使用的信息,以避免每次都进入db。

我的问题是,什么时候会被清除?或者它会保留在那里,直到我通过代码删除它或重新启动IIS?

2 个答案:

答案 0 :(得分:10)

缓存保存在内存中,直到进程停止。

因此,重置IIS或回收应用程序池也会清除缓存。

答案 1 :(得分:1)

根据MSDN,在以下情况下将清除缓存:

  1. 代码手动清除条目。
    • 通过使用Remove对象的Cache方法。
  2. 缓存条目到期。
    • 使用absoluteExpiration对象的slidingExpirationAdd方法的InsertCache参数。
  3. 已从缓存中删除了缓存项的依赖项。
    • 在将项目添加到缓存时,通过使用CacheDependency类来定义依赖项。
    • 删除依赖项将删除/终止所有依赖项。
  4. 主机进程结束(应用程序或IIS重置,应用程序池回收等)。
  5. 系统内存不足(自动-称为清除-参见下文)。

清理

即使情况1至4大多是不言自明的,但系统内存可用性情况一开始可能并不明显。请参阅下面有关缓存应用程序数据的MSDN文章中的引言。

  

Cache类提供了强大的功能,使您可以自定义项目的缓存方式以及缓存的时间。例如,当系统内存不足时,缓存会自动删除很少使用或优先级较低的项目以释放​​内存。这项技术称为清理,是缓存确保过时的数据不消耗宝贵的服务器资源的一种方式。

根据同一篇文章,您可以为缓存的项目设置优先级,以尝试保护最重要的项目免遭使用CacheItemPriority枚举自动删除的情况。

var expiresAt = DateTime.UtcNow.Date.AddHours(24);
System.Web.HttpContext.Current.Cache.Insert(
    "myKey",
    myValue,
    null,
    expiresAt,
    Cache.NoSlidingExpiration,
    CacheItemPriority.High,
    null
);

请注意,您还可以选择将优先级设置为NotRemovable,这将禁止通过清理自动删除此项。但是,请注意,这不是默认行为。

还要注意,如果通过将优先级设置为NotRemovable来通过高速缓存使用大量内存,则您的应用程序可能会抛出运行时内存可用性错误。

可以通过EffectivePercentagePhysicalMemoryLimit对象的属性Cache检索有关系统内存可用于应用程序的缓存的信息。

记录/调试

如果您希望通过日志(例如)仔细了解应用程序中缓存的状态,通常查看插入和从缓存中删除项目的时间通常很有用。

记录插入项的时间通常非常简单,因为您只需要查找对Add对象的InsertCache方法的调用。

但是,由于可能会自动删除缓存的项目,因此要记录删除项目,请在将项目插入缓存时使用CacheItemRemovedCallback委托类型。

当调试/改进严重依赖缓存数据的旧应用程序时,这真的很有用。

有关更多详细信息,请参见下面的MSDN文章。

来源:

MSDN文章:

API:


我知道这个问题可以追溯到2011年。但是,我花了一些时间才发现我正在处理的旧版应用程序中的错误是由基于可用物理内存的自动清除策略引起的。

希望这个答案会帮助别人。

感谢@J。 Ed和@Oded的回答和评论。他们帮助我正确地找到了问题所在。