使用静态或单例类而不是System.Web.HttpRuntime.Cache?

时间:2012-03-21 14:01:31

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

我坚信投入硬件来解决软件问题并不是最好的政策。因此,当我们发现其中一个服务器(目前运行2个演出)时出现了几个内存问题时,我将其跟踪到使用System.Web.HttpRuntime.Cache。虽然对于几个站点来说,这是有意义的,抛出50个站点,所有站点都使用System.Web.HttpRuntime.Cache开始降低墙壁。

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

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

在单例或静态类上使用System.Web.HttpRuntime.Cache会有更多的开销,以及解决此问题的一些推荐方法是什么?

- 更新 -

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

如何更快地将其清除,因为当多个应用程序池中此数字很高时似乎会出现问题?

而不仅仅是剥离缓存(正如所建议的那样,可能不是最好的主意),只是为缓存对象设置更快的到期时间可能会产生更好的结果?

2 个答案:

答案 0 :(得分:0)

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

我认为只有2GB内存的Windows网络服务器是低估的。

您需要查看项目在缓存中保留多长时间,使用频率等等。如果您过早过期,您可能会进一步将瓶颈推向堆栈,例如:到文件系统或DB,它们都比RAM慢。

我首先添加更多内存,这是最便宜的选择,然后追踪性能问题,看看是否有优化。

答案 1 :(得分:0)

查看这些网站上的代码,我发现了以下内容:

                    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);     

......我还没有证实这一点。