C#HttpRuntime.Cache.Insert()不保存缓存值

我正在尝试使用HttpRuntime.Cache.Insert()缓存价格值,但在清除之前只显示几个小时或者某个值。 我究竟做错了什么? 我希望值在缓存中保留3天。

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 

简短的回答

您的应用程序池或网站即将关闭。 扩展站点上的空闲超时,延长运行站点的池的应用程序池生命周期。 提高内存分配和请求限制。

完整答案

如果您想知道何时以及为何从缓存中删除某些内容,则需要使用插入时的CacheItemRemovedCallback选项记录项目删除…然后您可以使用CacheItemRemovedReason参数记录原因。 因此,您可以将原因记录为列出的四个原因之一:

  1. 已删除通过Remove方法调用或指定相同键的Insert方法调用将项目从缓存中删除。
  2. 已过期该项目已从缓存中删除,因为它已过期。
  3. 未使用该项目已从缓存中删除,因为系统已将其删除以释放内存。
  4. DependencyChanged该项目已从缓存中删除,因为与其关联的缓存依赖项已更改。

通常,您会发现Expired和Underused是没有明确的事情的原因删除对缓存的调用并且没有依赖项。

在追踪这些有趣的东西时,您可能会发现您的物品没有过期或未被充分利用。 相反,我怀疑你会发现AppDomain正在卸载。

由于web.config(或bin目录,或.aspx等)文件发生变化,这种情况可能会发生。 有关何时发生此更多信息,请参阅本页的“ 应用程序重新启动”部分。 发生这种情况时,将清除当前挂起的请求,清空缓存,并卸载AppDomain。 您可以通过检查AppDomain.IsFinalizingForUnload并在回调期间记录该情况来检测此情况。

AppDomain回收的另一个原因是IIS决定以其配置的任何原因回收AppPool。 其中的例子是xxx内存已经分配了整个生命周期,AppPool运行时yyy秒, ttt预定循环时间或iiii空闲时间(没有请求传入)。 有关更多详细信息,请查看本文的IIS6或IIS7的本文

Cache对象并不保证它会保留缓存对象,更不用说你建议的全部时间了。

如果您希望更强烈地鼓励它这样做,您可以在将项目插入缓存时设置CacheItemPriority.High或CacheItemPriority.NotRemovable。 使用默认的Normal优先级,运行时具有相当积极的策略,即在内存压力增加时释放对象。

最重要的是,默认情况下,IIS AppPool将每天/每天回收一次,这将清除缓存中的所有内容。

文档http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx表示如果使用绝对过期,则必须使用Cache.NoSlidingExpiration。

 HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

这可能不是你的问题,我只是发现Cache.NoSlidingExpiration应该与TimeSpan.Zero相同。

接下来我会检查你的应用程序池是否过期并检查你正在使用多少缓存。 如果它是一个使用大量内存(即内存缓存)的高流量站点,那么它将使缓存项到期,因为其他东西需要内存。

另请查看最近的评论http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon有人似乎找到了解决问题的方法。

检查应用程序池上的回收时间。

默认情况下,添加到缓存的项目没有设置到期,因此这绝对是缓存之外的内容。 我同意Josh,你应该检查你的应用程序池上的回收时间。

查看此页面以查看如何添加委托以让您确切知道何时从缓存中删除项目的示例。 如果它不是您的应用程序池,这可能有助于您进行故障排除:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

〜〜的md5sum