我正在考虑将 MemCached 用于我正在开发的 Web 应用程序,在过去几天研究 MemCached 之后,我遇到了一个我找不到答案的问题。
如何将 Memcached 服务器链接在一起,或者如何在 MemCached 服务器之间复制数据?
另外:此功能是由服务器还是客户端控制?如何控制?
我正在考虑将 MemCached 用于我正在开发的 Web 应用程序,在过去几天研究 MemCached 之后,我遇到了一个我找不到答案的问题。
如何将 Memcached 服务器链接在一起,或者如何在 MemCached 服务器之间复制数据?
另外:此功能是由服务器还是客户端控制?如何控制?
当您设置多个服务器时,客户端库使用第一个哈希来选择一个存储每个密钥/数据对的位置。这意味着没有复制,并且每个客户端都必须使用同一组服务器。
优点:
缺点:
如果您可以控制客户端的代码,您可以简单地将每个密钥/数据对存储在两台服务器上两次。当从不同的客户那里阅读时,一定要在相同的地方进行搜索。
我使用了 BeITMemcached,您创建了一个 MemcacheClient 实例并将您要使用的服务器设置为字符串。
在这一点上,客户端自己确定它可以将不同的项目放入哪些服务器。你永远不知道哪个项目会在里面。
在这里查看服务器如何处理故障转移。
最简单的事情是有一个重新填充机制。就我而言,我将数百个来自数据库的对象存储在 memcache 中。我可以调用 repopulate 并将它们全部放回那里。每当我向数据库添加、更新或删除它们时,我都会对 memcache 进行相同的调用。
http://repcached.lab.klab.org/
此外,PHP PECL memcache 客户端可以将数据复制到多个服务器,请参阅 memcache.redundancy。
听起来您希望拥有可以应对机器重新启动等的缓存……</p>
在很多情况下(假设您不是在编写 Facebook),RDMS 对缓存来说足够快。只需创建一个具有键和 blob 列的表。如果 RDBS 服务器有足够的内存,所有的数据都将在内存中并保存到磁盘以便恢复。
请记住,这可能是与主数据库服务器不同的服务器。
如果您希望更花哨并使用高端 RDMS,您可以在用于构建“缓存数据”的查询上设置更改通知,以从缓存中删除过期行。
您可以设置触发器以从缓存中清除无效行,但这可能非常复杂,非常快速。
Memcached 不提供复制属性。为此,您需要将服务器添加到 memcached 客户端服务器列表,然后点击数据库以将数据存储在该特定服务器中。
您应该认真考虑CouchBase。它使用 memcached 协议,提供几乎相同的速度,并提供您正在寻找的自动复制。它还保留在磁盘上,因此您的缓存永远不会变冷。