Singleton 是否使用静态类或单例类而不是System.Web.HttpRuntime.Cache?
我坚信用硬件解决软件问题不是最好的策略。因此,当注意到我们的一台服务器(目前运行2 Gig)存在一些内存问题时,我跟踪到System.Web.HttpRuntime.Cache的使用。而对于一些网站来说,这是有意义的,抛出50个全部使用System.Web.HttpRuntime.Cache的网站开始让墙倒塌 如果没有外部缓存服务器的选项,我将考虑修改代码,以使用静态类或单例进行全局数据保留(另一个选项是发出额外的db请求) 我不完全清楚这是否会有任何变化,因为数据仍然“在内存中”,我们可能只需要在服务器上投入更多内存 使用System.Web.HttpRuntime.Cache是否比使用单例类或静态类的开销大得多,建议使用哪些方法来解决此问题 --更新-- 在监视当前文件缓存内存使用情况时,当我访问同一应用程序池中的一些站点时,我注意到这个数字出现了峰值。这个数字上升到了1000000(我假设是字节)。我注意到,随着活动刷新条目的数量先增加后减少,这个数字最终开始减少 当这个数字在多个应用程序池中很高时,问题似乎就开始出现了,我怎样才能更快地解决这个问题呢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请求) 我不完全清楚这是否会有任何变化,因为数据仍然“在内存中”,我们可能只需
与其简单地删除缓存(正如建议的那样,这可能不是最好的主意),不如简单地为缓存对象设置一个更快的过期时间,这样可能会得到更好的结果。更改代码与购买更多内存的成本是多少 我认为只有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);
。。。我还没有确认这一点。仅仅是结束删除当前缓存也不一定是最好的策略,因为我不会说这本身就是一个问题——也许更值得一看问题站点实际使用缓存的目的是什么,每个站点的配置属性都包含在数据库中。加载站点时,配置对象存储在缓存中。与使用胖的复杂对象(包含实体关系)不同,使用更简单的扁平对象将限制内存消耗,但随着更多站点的添加,最终会导致同样的问题。仅仅结束删除当前缓存也不一定是最佳策略,正如我不会说的那样,这本身就是一个问题——也许更值得一看问题站点实际使用缓存做什么,并解决这个问题。每个站点的配置属性都包含在一个数据库中。加载站点时,配置对象存储在缓存中。与使用胖的复杂对象(包含实体关系)不同,使用更简单的平面对象将限制内存消耗,但随着更多站点的添加,最终将导致相同的问题。