我正在查看php docs on memcache并注意到而不是做了
$mem->connect('localhost', 11211)
我可以代替
$mem->addServer('localhost', 11211)
这样,如果我最终没有使用memcache连接,它就不会打扰连接。
这让我感到疑惑,为什么有人会使用connect()
而不是addServer()
?
这似乎是一种可能不必要的连接。我错过了什么吗?
答案 0 :(得分:10)
connect
和pconnect
似乎是更低级别的调用,它们执行单个任务而没有太多开销。 addServer
OTOH更高级别,管理多个服务器,当其中一个服务器出现故障时重试等等。我的印象是后者依赖前者来完成任务。
从最终用户的角度来看,使用较低级别的功能几乎没有什么优势,除了可能是一个小的性能改进(如果你知道你会立即使用连接,只有单个memcached服务器,不需要保持持久连接 - 或者实际上想要重置它以进行故障排除等 - 按需连接可能更快。只有当您需要对连接生命周期进行更多控制时(例如,如果您正在设计自己的缓存策略),这些功能才会有用。
换句话说,这些函数在API中公开的事实并不意味着它们会有一个共同的用例。尽管如此,提供更多与系统交互的工具往往更好,因为它鼓励平台构建。
答案 1 :(得分:3)
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。