Memcached to be or not to be? (c++)
Memcached to be or not to be? (c++)
我有一个3层结构,如下所示。A(web服务器)-->B(BizLib)-->C(DB服务器)
我想使用连接到B服务器末端的memcached,但我有点犹豫,因为它也通过网络,所以延迟降低并不明显。
我的计划是将一些常用的数据作为Map从DBServer预存储到BizLib中。
如果我的B服务器是一台正在运行的Thrift服务器,并且有很多用户使用访问我的BizLiz,但不同的用户如何使用我在B的BizLib内存中预先存储的同一组数据?我能把那个"缓存类"作为singleton,这样每个人都可以共享相同的值吗?
如果数据映射变得太大,它会崩溃还是效率低下?
请给我建议,因为我是建筑设计的新手。
谢谢。
不要在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服务器的情况。
听起来像是在尝试多层缓存。您正在数据映射、memcached和(可能)数据库层进行缓存。
这可能太过分了。特别是如果您正在考虑将memcached放在一台单独的机器中。
确保不要过早引入缓存。在引入缓存体系结构之前,先了解一下实际执行缓慢的部分。
看看您的数据库查找是否真的花费了比应该花费的更长的时间。大多数DBMS服务器都有一个用于经常加载的表和索引的缓存。
如果你决定要缓存,不要同时在memcached和BizLib中缓存。我个人会把它放在memcached中,它与您的BizLib一起在本地运行。这消除了网络延迟,但您仍然可以明确地调整缓存大小,并利用LRU算法等优势。
如果您后来决定在BizLib的多个实例之间共享缓存将比消除网络延迟受益更多,那么您可以随时整合(甚至联合缓存)。
- 为什么我会" void value not ignored as it ought to be"?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SFINAE:"enable_if cannot be used to disable this declaration"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- 我正在"void value not ignored as it ought to be"我该怎么办?
- 如何修复" State Error (active) E0513 a value of type "const wchar_t *" cannot be assigned to an entity o
- 谷歌模拟 - 怎么说"function must be called ONCE with a certain parameter but ok to be called many times with
- 如何解决访问不同功能的"nonstatic member reference must be relative to a specific object"
- 尝试分配函数指针时获取"Void value not ignored as it ought to be"
- "void value not ignored as it ought to be" - 出了什么问题?
- 0%2 coming out to be 1
- 在 QT 创建器"This does not seem to be a Debug build."中调试
- 为什么我会收到"void value not ignored as ought to be"错误?
- Qt 5.2 & iOS: "Nothing to be done"
- Memcached to be or not to be? (c++)
- Qt - 清洁和重建后的"This does not seem to be a debug build"
- "inline function need to be DEFINED in all tranlation units"背后的理由是什么?
- 简洁的"this class overrides all necessary methods to be non-abstract"
- C++ - "Cannot declare parameter 'anonymous' to be of abstract type"
- "void value not ignored as it ought to be" - 夸脱/C++