在我的Web表单应用程序中,我使用HttpContext.Current.Cache来存储一些不同表单使用的信息,以避免每次都进入db.
我的问题是,什么时候会被清除?或者它会保留在那里,直到我通过代码删除它或重新启动IIS?
小智 8
根据 MSDN,缓存将在以下情况下被清除:
Remove方法Cache。absoluteExpiration或slidingExpiration参数。AddInsertCacheCacheDependency在将项目添加到缓存时使用类定义依赖项。尽管情况 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
);
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以选择将优先级设置为NotRemovable,这将禁用通过清理自动删除此项目。但是,请注意这不是默认行为。
另请注意,如果您通过将优先级设置为 来通过缓存使用大量内存NotRemovable,您的应用程序可能会引发运行时内存可用性错误。
可以通过对象的属性检索有关系统内存有多少可用于应用程序缓存EffectivePercentagePhysicalMemoryLimit的信息Cache。
如果您希望通过日志(例如)仔细了解应用程序上缓存的状态,查看项目插入和从缓存中删除的时刻通常很有用。
记录项目插入的时刻通常非常简单,因为您只需查找对对象的Add或Insert方法的Cache调用。
但是,由于缓存项可能会自动删除,要记录项的删除,您应该CacheItemRemovedCallback在将项插入缓存时使用委托类型。
这在调试/改进严重依赖缓存数据的遗留应用程序时非常有用。
有关更多详细信息,请参阅下面的 MSDN 文章。
MSDN文章:
应用程序接口:
我知道这个问题是从 2011 年开始的。但是,我花了一些时间才发现我正在处理的遗留应用程序中的错误是由基于可用物理内存的自动清除策略引起的。
希望这个答案能帮助别人。
并感谢@J。Ed 和 @Oded 的回答和评论。他们帮助我找到了问题所在。
| 归档时间: |
|
| 查看次数: |
9471 次 |
| 最近记录: |