【问题标题】:HttpRuntime.Cache not suitable for web farms?HttpRuntime.Cache 不适合网络农场?
【发布时间】:2012-05-25 11:24:55
【问题描述】:

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

【问题讨论】:

    标签: asp.net asp.net-mvc caching memcached


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我同意。我将如何实现共享缓存?
    • @tamasInagy - 这超出了我可以在这里回答的范围。不过,在 Google 上搜索“memcached for .net”似乎会产生一些不错的文章。
    • 考虑 AppFabric。我目前正在这样做:)
    【解决方案2】:

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

    根据缓存对象的 MSDN 文档:

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

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

    【讨论】:

    • 在多个实例之间共享缓存会比粘性会话更好吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多