我有足够的可用内存(大约25GB的空闲内存),我不想缓存过期,只有在更改时才删除和重新缓存项目。由于我的网站正在测试过程中,它只缓存了1或2 KB的项目,但是当我在一段时间后检查缓存(例如半个小时)后,我发现它们已经过期了。我使用以下代码插入缓存:
Cache.Insert(ckey, Results, null, Cache.NoAbsoluteExpiration, TimeSpan.Zero);
这是我第一次使用缓存,有人知道代码或缓存有什么问题吗?
Cache.Insert(
ckey, Results,
null, /*CacheDependency*/
Cache.NoAbsoluteExpiration, /*absoluteExpiration*/
Cache.NoSlidingExpiration, /*slidingExpiratioin*/
CacheItemPriority.Normal, /*priority*/
null /*onRemoveCallback*/
);
请查看此文章以获取更多信息,可能已在其中得到解答:
我遇到了一个类似的问题。看起来HttpRuntime.Cache
会在它“感觉”内存不足时自行从缓存中移除项目。即使提供了CacheItemPriority.NotRemovable
优先级并且没有绝对/滑动过期时间,在正常应用程序域操作(无关闭)下也会发生这种情况。
HttpRuntime.Cache
提供了一个移除回调函数,用于在移除项目时使用。当然,为了过滤掉应用程序池关闭时的正常驱逐,应该检查System.Web.Hosting.HostingEnvironment.ShutdownReason
。
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);
MemoryCache 可以作为 HttpRuntime.Cache
的良好替代品。它提供非常相似的功能。完整的分析可以在 这里 阅读。