【问题标题】:Memcached to be or not to be? (c++)Memcached 存在还是不存在? (c++)
【发布时间】:2015-05-30 16:17:34
【问题描述】:

我有一个 3 层结构,如下所示。 A(网络服务器)--> B(BizLib)--> C(数据库服务器)

我想使用连接到我的 B 服务器末端的 memcached,但我有点犹豫,因为它也通过网络,所以延迟减少并不那么明显。

我的计划是将DB Server中一些常用的数据作为Map预存到BizLib中。

如果我的 B Server 是 Thrift Server 运行,并且有很多使用访问我的 BizLiz,但是不同的用户如何使用我在 BizLib 内存中的同一组预存数据?我可以将“缓存类”设为单例,以便每个人都共享相同的值吗?

如果数据 Map 变得太大,它会崩溃还是效率不高?

请指教,因为我是设计架构的新手。

谢谢。

【问题讨论】:

    标签: c++ database caching architecture memcached


    【解决方案1】:

    不要在 BizLib 内部做任何缓存,保持简单。

    Memcached 在内部处理您担心的所有任务,特别是在地图中存储项目、管理未使用缓存条目的逐出,甚至在地图超过本地内存时将其分发到多个物理服务器上。

    直接从 Web 应用程序访问 MemcacheD 服务器(分别是服务器池),不要通过服务器 B 走弯路。

    每当您的 Web 应用程序在 MemcacheD 中找不到一组数据时,让它将请求一直传递到数据库,并让 Web 应用程序将结果存储在 MemcacheD 中。

    不要尝试缓存任何东西,也不要限制自己只缓存数据库请求。 MemcacheD 还擅长缓存整个 HTML 片段,因为生成这些片段的成本也非常高,而且仅缓存这些片段而不是中间聚合非常简单。

    确保在特定位置添加缓存之前彻底分析您的应用程序。还要确保不要混合用户特定的视图和通用数据,只要可以避免,因为这意味着您不能再从合并的点为其他用户重用这些数据,这必须确保设计 Web 应用程序和 BizLib 之间的接口。

    通过避免绕道 B,您可以承担应用程序中最难扩展的部分的不必要负载,从而可以轻松添加额外的 Web 应用程序服务器和更多的 MemcacheD 实例。您还可以获得优势,甚至可以在 B 和 C 完全不参与的情况下处理一些请求。

    对于初学者,您甚至可以让 MemcacheD 与 Web 应用程序在同一台物理机器上运行 - 因为 Web 应用程序很可能会占用大量 CPU,而 MemcacheD 只需要 RAM。这样一来,您就可以完全避免网络延迟,即使这仅适用于只有一个 Web 服务器的情况。

    【讨论】:

      【解决方案2】:

      听起来您正在尝试在多个层进行缓存。您同时在数据映射、memcached 和(可能)在数据库层进行缓存。

      这可能太多了。特别是如果您正在考虑将 memcached 放在单独的机器中。

      确保不要过早引入缓存。在引入缓存架构之前,找出实际执行缓慢的原因。

      查看您的数据库查找是否实际上花费的时间比应有的要长。大多数 DBMS 服务器都为经常加载的表和索引提供缓存。

      如果您决定要缓存,请不要同时缓存在 memcached 和您的 BizLib 中。我个人会放入在您的 BizLib 本地运行的 memcached 中。这消除了网络延迟,但您仍然可以获得明确调整缓存大小以及利用 LRU 算法等优势。

      如果您后来决定在 BizLib 的多个实例之间共享缓存比消除网络延迟更有益,您可以随时合并(甚至联合缓存)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        相关资源
        最近更新 更多