我有足够的可用内存(大约25 GB的可用内存),我不希望缓存过期,我只是在发生更改时删除并重新安装项目。由于我的网站处于测试过程中,它有1个或2 KB的缓存项目,但是当我在一段时间后检查缓存(如半小时)后,我发现它们已经过期了。我使用此代码插入缓存:
Cache.Insert(ckey, Results, null, Cache.NoAbsoluteExpiration, TimeSpan.Zero);
这是我第一次使用缓存,有人知道代码或缓存有什么问题吗?
答案 0 :(得分:1)
试试这个
Cache.Insert(
ckey, Results,
null, /*CacheDependency*/
Cache.NoAbsoluteExpiration, /*absoluteExpiration*/
Cache.NoSlidingExpiration, /*slidingExpiratioin*/
CacheItemPriority.Normal, /*priority*/
null /*onRemoveCallback*/
);
查看此文章以获取更多信息,可能已在那里得到答案:
答案 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。