我正在查看memcache 上的 php 文档,并注意到
$mem->connect('localhost', 11211)
我可以做而不是做
$mem->addServer('localhost', 11211)
这样,如果我最终不使用 memcache 连接,它就不会打扰连接。
这让我想知道,为什么有人会使用connect()
over addServer()
?
这似乎是一种可能的不必要的联系。我错过了什么吗?
我正在查看memcache 上的 php 文档,并注意到
$mem->connect('localhost', 11211)
我可以做而不是做
$mem->addServer('localhost', 11211)
这样,如果我最终不使用 memcache 连接,它就不会打扰连接。
这让我想知道,为什么有人会使用connect()
over addServer()
?
这似乎是一种可能的不必要的联系。我错过了什么吗?
connect
并且pconnect
似乎是更底层的调用,它们执行单个任务而没有太多开销。addServer
OTOH 级别更高,管理多台服务器,当其中一个失败时重试等等。我的印象是后者依赖前者来完成任务。
从最终用户的角度来看,使用较低级别的功能几乎没有什么优势,除了可能作为一个小的性能改进(如果您知道您将立即使用连接,则只有一个 memcached 服务器并且不需要保持持久连接 - 或者实际上想要重置它以进行故障排除等 - 按需连接可能会更快)。只有当您需要对连接生命周期进行更多控制时(例如,如果您正在设计自己的缓存策略),这些功能才会有用。
换句话说,这些函数在 API 中公开的事实并不意味着它们会有一个共同的用例。尽管如此,提供更多与系统交互的工具通常比提供更少的工具更好,因为它鼓励平台构建。
实际上,在Memcache::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 理想地用于单个主机设置,而不是用于池,除非打算与池中的特定主机通信以获取统计信息、维护操作或特殊缓存方案。更多讨论在这里。