我在看着 关于memcache的php文档 并注意到而不是做
$mem->connect('localhost', 11211)
我可以做
$mem->addServer('localhost', 11211)
这样,如果我最终没有使用memcache连接,它将不会打扰连接。
这让我想知道,为什么有人会用 connect()
过度 addServer()
?
这似乎是一种可能不必要的连接。我错过了什么吗?
我在看着 关于memcache的php文档 并注意到而不是做
$mem->connect('localhost', 11211)
我可以做
$mem->addServer('localhost', 11211)
这样,如果我最终没有使用memcache连接,它将不会打扰连接。
这让我想知道,为什么有人会用 connect()
过度 addServer()
?
这似乎是一种可能不必要的连接。我错过了什么吗?
connect
和 pconnect
似乎是更低级别的调用,执行单个任务而没有太多开销。 addServer
OTOH是更高级别,管理多个服务器,当其中一个服务器出现故障时重试等等。我的印象是后者依赖前者来完成其任务。
从最终用户的角度来看,使用低级功能几乎没有什么优势,除了可能是一个小的性能改进(如果你 知道 你将立即使用连接,只有一个memcached服务器,不需要保持持久连接 - 或实际上 希望 重置它以进行故障排除等 - 按需连接可能会更快。只有当您需要对连接生命周期进行更多控制时(例如,如果您正在设计自己的缓存策略),这些功能才会有用。
换句话说,这些函数在API中公开的事实并不意味着它们将有一个共同的用例。尽管如此,提供更多与系统交互的工具往往更好,因为它鼓励平台构建。
实际上,在文档页面上可以很好地解释这种差异 内存缓存:: addServer
connect()直接连接到memcached的单个实例。
addServer()向Memcache扩展使用的服务器池添加一个条目,但在您执行需要连接的操作之前,它实际上不会连接。
使用此方法时(与Memcache :: connect()和Memcache :: pconnect()相反),在实际需要之前不会建立网络连接。因此,向池中添加大量服务器没有任何开销,即使它们可能并非都被使用。
使用服务器池意味着如果一个memcached实例/连接抛出低级别错误,Memcache扩展将自动连接到另一个服务器以发出请求。
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理想地用于单个主机设置,而不用于池,除非打算与池中的特定主机通信以获取统计信息,维护操作或特殊缓存方案。更多讨论 这里。