缓存过期虽然明确设置为不过期

时间:2015-06-18 08:21:49

标签: c# asp.net caching

我有足够的可用内存(大约25 GB的可用内存),我不希望缓存过期,我只是在发生更改时删除并重新安装项目。由于我的网站处于测试过程中,它有1个或2 KB的缓存项目,但是当我在一段时间后检查缓存(如半小时)后,我发现它们已经过期了。我使用此代码插入缓存:

Cache.Insert(ckey, Results, null, Cache.NoAbsoluteExpiration, TimeSpan.Zero);

这是我第一次使用缓存,有人知道代码或缓存有什么问题吗?

3 个答案:

答案 0 :(得分:1)

试试这个

Cache.Insert(
 ckey, Results,
 null,                     /*CacheDependency*/
Cache.NoAbsoluteExpiration,     /*absoluteExpiration*/
Cache.NoSlidingExpiration,      /*slidingExpiratioin*/
CacheItemPriority.Normal, /*priority*/
null                      /*onRemoveCallback*/
);

查看此文章以获取更多信息,可能已在那里得到答案:

Default duration of Cache.Insert in ASP.NET

答案 1 :(得分:1)

如果你要离开它一段时间,那么你可能会因为缺乏使用而关闭你的应用程序域,如果它在内存缓存中也是如此。

ASP.NET Data Cache - preserve contents after app domain restart讨论了这个问题及其可能的解决方案。

答案 2 :(得分:0)

我偶然发现similar issue。当“感觉”没有足够的内存时,null可以自由地从缓存中删除项目。即使提供HttpRuntime.Cache优先级以及没有绝对/无滑动到期且在正常的应用程序域操作(无关闭)下,也会发生这种情况。

如何捕获实际到期时间

CacheItemPriority.NotRemovable提供了删除项目时使用的删除回调。当然,为了过滤掉应用程序池关闭时的正常驱逐,应该检查HttpRuntime.Cache

System.Web.Hosting.HostingEnvironment.ShutdownReason

替代

MemoryCache可以用作public class ApplicationPoolService : IApplicationPoolService { public bool IsShuttingDown() { return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None; } } private void ReportRemovedCallback(string key, object value, CacheItemRemovedReason reason) { if (!ApplicationPoolService.IsShuttingDown()) { var str = $"Removed cached item with key {key} and count {(value as IDictionary)?.Count}, reason {reason}"; LoggingService.Log(LogLevel.Info, str); } } HttpRuntime.Cache.Insert(CacheDictKey, dict, dependencies: null, absoluteExpiration: DateTime.Now.AddMinutes(absoluteExpiration), slidingExpiration: slidingExpiration <= 0 ? Cache.NoSlidingExpiration : TimeSpan.FromMinutes(slidingExpiration), priority: CacheItemPriority.NotRemovable, onRemoveCallback: ReportRemovedCallback); 的替代品。它提供了非常相似的功能。完整分析可以阅读here