2012-08-12 65 views
11

我一直在寻找在php docs on memcache,发现的,而不是做
$mem->connect('localhost', 11211)我可以做的,而不是
$mem->addServer('localhost', 11211)内存缓存连接VS addServer

而这样一来,如果我没有最终使用内存缓存的连接,它赢得别再打扰了。

这让我想知道,为什么有人会使用connect()而不是addServer()

这似乎是一个可能的不必要的连接。我错过了什么吗?

回答

10

connectpconnect似乎是更低级别的调用,它们执行单个任务时没有太多开销。 addServer OTOH更高级别,管理多台服务器,当其中一台服务器出现故障时重试,等等。我的印象是后者依靠前者来完成任务。

从最终用户的角度来看,确实有点优势在使用较低级别的功能,也许除了作为一个小的性能提升(如果你知道你会使用连接向右走,只有一个memcached服务器并且不需要保持持续连接 - 或者实际上想要将其重置以用于故障排除等 - 根据需要连接可能更快)。只有当您需要对连接生命周期进行更多控制时(例如,如果您正在设计自己的缓存策略),这些功能才会有用。

换句话说,这些函数暴露在API中的事实并不意味着它们会有一个通用的用例。尽管如此,提供更多的工具来与系统进行交互比通常更少,因为它鼓励了平台构建。

3

的差异实际上是解释相当不错的文档页面上Memcache::addServer

连接()使得以分布式缓存的单个实例的直接连接。

addServer()向Memcache扩展使用的服务器池添加一个条目,但直到您执行需要连接的操作时才会实际连接。

当使用此方法(而不是Memcache :: connect()和Memcache :: pconnect())时,直到实际需要时才建立网络连接。因此,向池中添加大量服务器没有任何开销,即使它们可能并未全部使用。

使用服务器池意味着如果一个memcached实例/连接抛出低级错误,则Memcache扩展将自动连接到另一个服务器以发出请求。

3

Memcache是​​一个分布式缓存设计。当您使用服务器池时,对象将通过密钥分发机制存储在所有服务器上,该机制根据服务器的权重和密钥本身的散列来选择服务器。现在

,在2台内存缓存服务器的设置,一会是这样的:

$memcache = new Memcache; 
$memcache->addServer('memcache_host1', 11211); 
$memcache->addServer('memcache_host2', 11211); 

发布这些调用,PHP的过程中会看到两个服务器的服务器池,并均匀地分布对象给他们在Memcache :: addServer调用中选择默认权重。因此,调用Memcache :: get或Memcache :: set将根据密钥从服务器池中保存对象或从正确的主机检索键值。

但是,Memcache :: connect会重新初始化主机池,并假定只有一个主机可用,并且所有对象都存储在该主机上。这也意味着,如果你这样做:

$memcache = new Memcache; 
$memcache->addServer('memcache_host1', 11211); 
$memcache->addServer('memcache_host2', 11211); 

$memcache->connect('memcache_host1', 11211); 

的最后一次通话将清除服务器池和内存缓存::连接呼叫将memcache_host1保存后的所有按键。因此,Memcache :: connect最好在单个主机设置上使用,永远不要使用池,除非有意与池中的特定主机通信以获取统计信息,维护操作或特殊缓存方案。更多讨论here