【问题标题】:Cache expires although explicitly set not to expire尽管明确设置为不过期,但缓存过期
【发布时间】:2015-09-03 18:42:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# asp.net caching


    【解决方案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

    【讨论】:

    • 谢谢。让我测试一下。这需要一段时间;)
    【解决方案2】:

    如果您要离开它一段时间,那么您的应用程序域可能会由于缺乏使用而关闭,如果这样的话,它的内存缓存也会关闭。

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

    【讨论】:

    • 但是半小时后应用域会关闭吗?
    • 你告诉我。 :) 它可能会。有多种方法可以判断您的应用程序域是否已被回收,我相信快速谷歌会告诉您。如果您的缓存不丢失很重要,那么您至少需要意识到这种可能性,以便您可以查看其他可能更可靠的缓存形式。
    • 好吧,我的网站每天有大约 100000 次页面浏览量,现在我正在从头开始编写我的网站,添加多语言......所以我有很多可用内存,我想做到最好可以
    【解决方案3】:

    我偶然发现了similar issue。看起来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。它提供了非常相似的功能。完整的分析可以阅读here。

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2021-12-17
      • 2012-03-18
      • 2010-09-25
      • 2021-04-05
      • 2013-11-20
      • 1970-01-01
      • 2011-12-27
      • 2017-07-14
      相关资源
      最近更新 更多