缓存过期了,尽管明确设置为不过期。

4

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

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

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

3个回答

1

应用程序域在半个小时后是否会关闭? - Ashkan Mobayen Khiabani
你告诉我吧。:) 这可能有效。有很多方法可以判断你的应用程序域是否已被回收,我相信通过快速搜索就能找到相关信息。但如果你的缓存不能丢失很重要的话,那么你至少需要意识到这种可能性,这样你就可以考虑其他更可靠的缓存形式了。 - Chris
我的网站每天大约有10万次页面浏览量,现在我正在从头开始编写我的网站,添加多语言等功能。因为我有很多可用的内存,所以我想尽力做到最好。 - Ashkan Mobayen Khiabani

1
尝试这个。
Cache.Insert(
 ckey, Results,
 null,                     /*CacheDependency*/
Cache.NoAbsoluteExpiration,     /*absoluteExpiration*/
Cache.NoSlidingExpiration,      /*slidingExpiratioin*/
CacheItemPriority.Normal, /*priority*/
null                      /*onRemoveCallback*/
);

请查看此文章以获取更多信息,可能已在其中得到解答:

ASP.NET中Cache.Insert的默认持续时间


谢谢。让我测试一下。这会花一些时间 ;) - Ashkan Mobayen Khiabani

0

我遇到了一个类似的问题。看起来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 的良好替代品。它提供非常相似的功能。完整的分析可以在 这里 阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接