我正在尝试使用HttpRuntime.Cache.Insert()缓存价格值,但只有在清除之前才会显示该值保持几个小时。我究竟做错了什么?我希望该值在缓存中保留3天。
HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero);
答案 0 :(得分:33)
您的应用程序池或网站过早关闭。扩展站点上的空闲超时,延长运行站点的池的应用程序池生命周期。提高内存分配和请求限制。
如果您想知道从缓存中移除某些内容的时间和原因,您需要使用插入上的CacheItemRemovedCallback选项记录项目删除...然后您可以使用{{ 3}}论证。因此,您可以将原因记录为列出的四个原因之一:
通常,您会发现Expired和Underused是没有明确的事情的原因删除对缓存的调用并且没有依赖。
在追踪这些有趣的东西时,你可能会发现你的物品没有过期或未被充分利用。相反,我怀疑你会发现AppDomain正在卸载。
由于web.config(或bin目录或.aspx等)文件发生了变化,因此可能会发生这种情况。有关何时发生这种情况的详细信息,请参阅CacheItemRemovedReason的应用程序重新启动部分。发生这种情况时,将清除当前挂起的请求,清空缓存,并卸载AppDomain。您可以通过检查this page并在回调期间记录来检测这种情况。
AppDomain回收的另一个原因是IIS决定回收AppPool时出于其配置的任何原因。例如 xxx 内存已在生命周期内分配, yyy 运行时秒为AppPool, ttt 预定回收时间或 iiii 空闲时间(没有请求传入)。有关详细信息,请查看AppDomain.IsFinalizingForUnload或this article for IIS6
答案 1 :(得分:5)
Cache对象并不保证它会保留缓存对象,更不用说你建议的全部时间了。
如果您想更强烈地鼓励它这样做,您可以在将项目插入缓存时设置CacheItemPriority.High或CacheItemPriority.NotRemovable。使用默认的Normal优先级时,运行时具有相当积极的策略,即在内存压力增加时释放对象。
最重要的是,默认情况下,IIS AppPool将每天/每天回收一次,这将清除缓存中的所有内容。
答案 2 :(得分:4)
文档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有人似乎找到了解决问题的方法。
答案 3 :(得分:1)
检查应用程序池上的回收时间。
答案 4 :(得分:0)
默认情况下,添加到缓存中的项目没有设置过期,因此这绝对是缓存之外的内容。我同意Josh,你应该检查你的应用程序池上的回收时间。
查看此页面以查看如何添加委托以让您确切知道何时从缓存中删除项目的示例。如果它不是您的应用程序池,这可能有助于您进行故障排除:
http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx
〜的md5sum〜