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