【发布时间】:2012-05-25 11:24:55
【问题描述】:
我听说HttpRuntime.Cache 不适合与网络农场一起使用。这是为什么?这个问题有哪些很好的示例解决方法?我听说过Memcached 和类似的产品,但我找不到任何显示基本用法的近期示例。
【问题讨论】:
标签: asp.net asp.net-mvc caching memcached
我听说HttpRuntime.Cache 不适合与网络农场一起使用。这是为什么?这个问题有哪些很好的示例解决方法?我听说过Memcached 和类似的产品,但我找不到任何显示基本用法的近期示例。
【问题讨论】:
标签: asp.net asp.net-mvc caching memcached
服务器场中 HttpRuntime.Cache 的一个问题是缓存中的大部分数据将跨服务器复制。
例如,假设您有一个电子商务网站,并且您将产品目录存储在缓存中(因为它很少更改),这需要 20M 的内存。如果您有 5 台 Web 服务器,每个服务器的缓存中都有自己的产品目录副本,总共使用 100M 内存(20M * 5 个服务器)。使用像 memcached 这样的共享缓存可以通过只存储一份缓存项而不是 5 个副本(每个服务器一个)来消除这种浪费。
另一个问题是缓存同步。同样,假设您在从数据库中检索产品目录后将其缓存 1 小时。每个服务器都可以在其缓存中拥有一份在不同时间到期的目录副本。当一台服务器上的缓存过期时,它可以获得其他服务器尚未更新的数据。
这可能会导致奇怪的用户体验,他们可能会在一个类别中看到 50 个产品,然后刷新页面,发送到不同的服务器,然后看到 51,再次刷新并再次看到 50,等等。使用共享缓存,您不必担心。
【讨论】:
HttpRuntime.Cache 对象是System.Web.Caching.Cache 的一个实例。
根据缓存对象的 MSDN 文档:
这个类的一个实例是为每个应用程序域创建的,它 只要应用程序域保持活动状态,它就保持有效。
在 webfarm 上,您有多台机器处理站点的负载,因此有时您的请求可能会发送到机器 A,有时可能会发送到机器 B,等等。如果您在机器 A 的缓存中粘贴一些内容,然后您的下一个请求转到机器 B,您将无法将其从缓存中取出。这就像 Session management 对 InProc 的限制。为了解决这个问题,您可以研究粘性会话。
【讨论】: