2

我听说这HttpRuntime.Cache不适合与网络农场一起使用。这是为什么?这个问题有哪些很好的示例解决方法?我听说过Memcached和类似的产品,但我找不到任何显示基本用法的最新示例。

4

2 回答 2

11

服务器场中 HttpRuntime.Cache 的一个问题是缓存中的大部分数据将在服务器之间复制。

例如,假设您有一个电子商务网站,并且您将产品目录存储在缓存中(因为它很少更改),这需要 20M 的内存。如果您有 5 台 Web 服务器,则每台服务器的缓存中都有自己的产品目录副本,总共使用 100M 内存(20M * 5 台服务器)。使用像 memcached 这样的共享缓存通过只存储缓存项目的一份副本而不是 5 个副本(每个服务器一份)来消除这种浪费。

另一个问题是缓存同步。同样,假设您在从数据库中检索产品目录后将其缓存 1 小时。每个服务器都可以在其缓存中拥有一份在不同时间到期的目录副本。当一台服务器上的缓存过期时,它可以获得其他服务器尚未更新的数据。

这可能会导致奇怪的用户体验,他们可能会在一个类别中看到 50 个产品,然后刷新页面,被发送到不同的服务器,然后看到 51,再次刷新并再次看到 50,等等。使用共享缓存,您不需要不必担心。

于 2012-05-17T21:06:05.283 回答
2

HttpRuntime.Cache对象是System.Web.Caching.Cache的一个实例。

根据 Cache 对象的 MSDN 文档:

每个应用程序域创建一个此类的实例,只要应用程序域保持活动状态,它就保持有效。

在 webfarm 上,您有多台机器处理站点的负载,因此有时您的请求可能会发送到机器 A,有时可能会发送到机器 B,等等。如果您将某些内容粘贴到机器 A 上的缓存中,然后您的下一个请求发送到机器 B,您将无法将其从缓存中取出。这就像 InProc for Session management的限制。为了解决这个问题,您可以研究粘性会话。

于 2012-05-17T20:58:36.590 回答