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

Singleton 是否使用静态类或单例类而不是System.Web.HttpRuntime.Cache?,singleton,asp.net-4.0,http-caching,static-classes,Singleton,Asp.net 4.0,Http Caching,Static Classes,我坚信用硬件解决软件问题不是最好的策略。因此,当注意到我们的一台服务器(目前运行2 Gig)存在一些内存问题时,我跟踪到System.Web.HttpRuntime.Cache的使用。而对于一些网站来说,这是有意义的,抛出50个全部使用System.Web.HttpRuntime.Cache的网站开始让墙倒塌 如果没有外部缓存服务器的选项,我将考虑修改代码,以使用静态类或单例进行全局数据保留(另一个选项是发出额外的db请求) 我不完全清楚这是否会有任何变化,因为数据仍然“在内存中”,我们可能只需

我坚信用硬件解决软件问题不是最好的策略。因此,当注意到我们的一台服务器(目前运行2 Gig)存在一些内存问题时,我跟踪到System.Web.HttpRuntime.Cache的使用。而对于一些网站来说,这是有意义的,抛出50个全部使用System.Web.HttpRuntime.Cache的网站开始让墙倒塌

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

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

使用System.Web.HttpRuntime.Cache是否比使用单例类或静态类的开销大得多,建议使用哪些方法来解决此问题

--更新--

在监视当前文件缓存内存使用情况时,当我访问同一应用程序池中的一些站点时,我注意到这个数字出现了峰值。这个数字上升到了1000000(我假设是字节)。我注意到,随着活动刷新条目的数量先增加后减少,这个数字最终开始减少

当这个数字在多个应用程序池中很高时,问题似乎就开始出现了,我怎样才能更快地解决这个问题呢


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

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

我认为只有2GB内存的windows web服务器是低于标准的

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


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

与购买更多内存相比,更改代码的成本是多少

我认为只有2GB内存的windows web服务器是低于标准的

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


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

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

                    HttpRuntime.Cache.Insert(
                        /* key */                "WebsiteConfiguration",
                        /* value */              website,
                        /* dependencies */       null,
                        /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
                        /* slidingExpiration */  Cache.NoSlidingExpiration,
                        /* priority */           CacheItemPriority.NotRemovable,
                        /* onRemoveCallback */   null); 
我认为一个主要的问题可能是
NoSlidingExpiration
NotRemovable

现在,如果我们设置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);     

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

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

                    HttpRuntime.Cache.Insert(
                        /* key */                "WebsiteConfiguration",
                        /* value */              website,
                        /* dependencies */       null,
                        /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
                        /* slidingExpiration */  Cache.NoSlidingExpiration,
                        /* priority */           CacheItemPriority.NotRemovable,
                        /* onRemoveCallback */   null); 
我认为一个主要的问题可能是
NoSlidingExpiration
NotRemovable

现在,如果我们设置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);     

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

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