Memcached 是还是不是? (c++)

Memcached to be or not to be? (c++)

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

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

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

如果我的B Server是Thrift Server运行,访问我的BizLiz的用户很多,但是不同的用户如何使用我在B的BizLib内存中预存的同一套数据呢?我可以将 "cache class" 设置为单例,以便每个人都共享相同的值吗?

如果 data Map 增长太大,会不会崩溃或者效率不高?

建筑设计新手请多多指教

谢谢。

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

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

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

查看您的数据库查找实际上是否花费了比应有的时间更长的时间。大多数 DBMS 服务器都有一个用于经常加载的表和索引的缓存。

如果您决定要缓存,请不要同时在 memcached 和 BizLib 中缓存。我会亲自将 运行 本地的 memcached 与您的 BizLib 一起放入。这消除了网络延迟,但您仍然可以显式调整缓存大小并利用 LRU 算法等优势。

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

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

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

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

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

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

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

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

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