memcache connect vs addServer

时间:2012-08-12 22:32:23

标签: php memcached

我正在查看php docs on memcache并注意到而不是做了 $mem->connect('localhost', 11211)我可以代替 $mem->addServer('localhost', 11211)

这样,如果我最终没有使用memcache连接,它就不会打扰连接。

这让我感到疑惑,为什么有人会使用connect()而不是addServer()

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

3 个答案:

答案 0 :(得分:10)

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

从最终用户的角度来看,使用较低级别的功能几乎没有什么优势,除了可能是一个小的性能改进(如果你知道你会立即使用连接,只有单个memcached服务器,不需要保持持久连接 - 或者实际上想要重置它以进行故障排除等 - 按需连接可能更快。只有当您需要对连接生命周期进行更多控制时(例如,如果您正在设计自己的缓存策略),这些功能才会有用。

换句话说,这些函数在API中公开的事实并不意味着它们会有一个共同的用例。尽管如此,提供更多与系统交互的工具往往更好,因为它鼓励平台构建。

答案 1 :(得分:3)

Memcache::addServer

的文档页面上,实际上已经很好地解释了这种差异

connect()直接连接到memcached的单个实例。

addServer()向Memcache扩展使用的服务器池添加一个条目,但在您执行需要连接的操作之前,它实际上不会连接。

  

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

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

答案 2 :(得分:3)

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

现在,在2个memcache服务器上的设置中,可以这样:

$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 :: connect调用之后的所有密钥将保存在memcache_host1中。因此,Memcache :: connect理想地用于单个主机设置,从不用于池,除非打算与池中的特定主机通信以获取统计信息,维护操作或特殊缓存方案。更多讨论here