【问题标题】:Use static or singleton classes instead of System.Web.HttpRuntime.Cache?使用静态或单例类而不是 System.Web.HttpRuntime.Cache?
【发布时间】:2012-04-06 01:29:12
【问题描述】:

我坚信用硬件来解决软件问题并不是最好的策略。因此,当注意到我们的一台服务器(当前运行 2 个演出)存在一些内存问题时,我将其归结为 System.Web.HttpRuntime.Cache 的使用。虽然对于几个网站来说,这是有道理的,50 个网站都使用 System.Web.HttpRuntime.Cache 开始倒塌。

如果没有外部缓存服务器的选项,我正在考虑修改代码以使用静态类或单例来保留全局数据(另一种选择是发出额外的数据库请求)。

我不完全清楚这是否会有任何变化,因为数据仍在“内存中”,我们可能只需要在服务器上投入更多内存。

使用 System.Web.HttpRuntime.Cache 是否比单例类或静态类有更多的开销,有哪些推荐的方法来解决这个问题?

-- 更新--

在监控当前文件缓存内存使用情况时,我注意到这个数字在我访问同一个应用程序池上的一些站点时出现了峰值。这个数字跃升至 1,000,000(我假设的字节数)。我注意到随着 Active Flushed Entries 的数量增加然后减少,这个数字最终开始减少。

我怎样才能更快地清除它,因为当多个应用程序池中的这个数字很高时,问题似乎就开始了?

与其只是删除缓存(正如建议的那样,这可能不是最好的主意),不如简单地为缓存对象设置一个更快的过期时间可能会产生更好的结果?

【问题讨论】:

  • 仅仅结束当前的缓存也不一定是最好的策略,因为我不会说这将是一个问题固有 - 也许更值得看看什么问题站点实际上正在使用缓存并解决它。
  • 每个站点的配置属性都包含在一个数据库中。当站点加载时,配置对象存储在缓存中。与其使用胖的复杂对象(包含实体关系),不如使用更简单的扁平对象会限制内存消耗,但最终会在添加更多站点时导致同样的问题。

标签: singleton asp.net-4.0 http-caching static-classes


【解决方案1】:

更改代码与购买更多内存的成本是多少?

我会说只有 2GB 内存的 Windows 网络服务器规格不足。

您需要查看项目在缓存中的停留时间、使用频率等。如果您过早地使它们过期,您可能会将瓶颈推到堆栈的下方,例如到文件系统或数据库上,它们都比 RAM 慢。

作为第一步,我会添加更多 RAM,这是最便宜的选择,然后跟踪性能问题以查看是否需要优化。

【讨论】:

    【解决方案2】:

    浏览这些网站上的代码,我发现如下:

                        HttpRuntime.Cache.Insert(
                            /* key */                "WebsiteConfiguration",
                            /* value */              website,
                            /* dependencies */       null,
                            /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
                            /* slidingExpiration */  Cache.NoSlidingExpiration,
                            /* priority */           CacheItemPriority.NotRemovable,
                            /* onRemoveCallback */   null); 
    

    我认为NoSlidingExpirationNotRemovable 可能是一个主要问题。

    现在,如果我们设置 30 秒的缓存超时,这可能会解决这个问题:

    if (System.Web.HttpRuntime.Cache["WebsiteConfiguration"] == null)
    .
    .
    .
    
                        HttpRuntime.Cache.Insert(
                            /* key */                "WebsiteConfiguration",
                            /* value */              website,
                            /* dependencies */       null,
                            /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
                            /* slidingExpiration */  new TimeSpan(0,0,30),               // zero timespan or not long enough will cause a null ref exception when used
                            /* priority */           CacheItemPriority.Normal,
                            /* onRemoveCallback */   null);     
    

    ...我还没有确认这一点。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多