8

我正在考虑将 MemCached 用于我正在开发的 Web 应用程序,在过去几天研究 MemCached 之后,我遇到了一个我找不到答案的问题。

如何将 Memcached 服务器链接在一起,或者如何在 MemCached 服务器之间复制数据?

另外:此功能是由服务器还是客户端控制?如何控制?

4

6 回答 6

7

当您设置多个服务器时,客户端库使用第一个哈希来选择一个存储每个密钥/数据对的位置。这意味着没有复制,并且每个客户端都必须使用同一组服务器。

优点:

  • 几乎为零开销,存储和带宽线性增长。
  • 服务器代码保持简单可靠。

缺点:

  • 服务器集的任何更改(一个出现故障,或者您添加一个新的)都会突然(几乎)使整个缓存无效。
  • 您必须确保在每个客户端上使用相同的算法。

如果您可以控制客户端的代码,您可以简单地将每个密钥/数据对存储在两台服务器上两次。当从不同的客户那里阅读时,一定要在相同的地方进行搜索。

于 2008-12-09T12:16:14.757 回答
5

我使用了 BeITMemcached,您创建了一个 MemcacheClient 实例并将您要使用的服务器设置为字符串。

在这一点上,客户端自己确定它可以将不同的项目放入哪些服务器。你永远不知道哪个项目会在里面。

在这里查看服务器如何处理故障转移

最简单的事情是有一个重新填充机制。就我而言,我将数百个来自数据库的对象存储在 memcache 中。我可以调用 repopulate 并将它们全部放回那里。每当我向数据库添加、更新或删除它们时,我都会对 memcache 进行相同的调用。

于 2009-02-27T19:50:35.067 回答
2

http://repcached.lab.klab.org/

此外,PHP PECL memcache 客户端可以将数据复制到多个服务器,请参阅 memcache.redundancy。

于 2009-03-02T15:21:55.670 回答
1

听起来您希望拥有可以应对机器重新启动等的缓存……</p>

在很多情况下(假设您不是在编写 Facebook),RDMS 对缓存来说足够快。只需创建一个具有键和 blob 列的表。如果 RDBS 服务器有足够的内存,所有的数据都将在内存中并保存到磁盘以便恢复。

请记住,这可能是与主数据库服务器不同的服务器。

如果您希望更花哨并使用高端 RDMS,您可以在用于构建“缓存数据”的查询上设置更改通知,以从缓存中删除过期行。

您可以设置触发器以从缓存中清除无效行,但这可能非常复杂,非常快速。

于 2009-02-27T10:41:10.580 回答
0

Memcached 不提供复制属性。为此,您需要将服务器添加到 memcached 客户端服务器列表,然后点击数据库以将数据存储在该特定服务器中。

于 2012-06-15T06:39:24.760 回答
0

您应该认真考虑CouchBase。它使用 memcached 协议,提供几乎相同的速度,并提供您正在寻找的自动复制。它还保留在磁盘上,因此您的缓存永远不会变冷。

于 2012-06-15T12:43:03.043 回答