Memcache connect vs addServer

Я смотрел php docs на memcache и заметил, что вместо того, чтобы делать $mem->connect('localhost', 11211) Я могу сделать вместо этого $mem->addServer('localhost', 11211)

И таким образом, если я не воспользуюсь соединением memcache, он не свяжется с подключением.

Мне стало интересно, почему кто-то когда-либо использовал connect() над addServer()?

Это просто похоже на возможное ненужное соединение. Я что-то пропустил?

Ответ 1

connect и pconnect кажутся быть более низкоуровневыми вызовами, которые выполняют одну задачу без больших накладных расходов. addServer OTOH более высокий уровень, управляя несколькими серверами, повторяя, когда один из них терпит неудачу, и т.д. У меня создается впечатление, что последний полагается на первое, чтобы выполнить свою задачу.

С точки зрения конечного пользователя действительно мало преимуществ в использовании функции нижнего уровня, за исключением, возможно, небольшого улучшения производительности (если вы знаете, вы сразу же используете соединение, один сервер memcached и не нужно поддерживать постоянное соединение - или фактически хочет - reset для устранения неполадок и т.д. - возможно, быстрее будет просто подключаться по требованию). Только если вам нужно больше контролировать жизненный цикл соединения (например, если вы разрабатываете собственную стратегию кэширования), эти функции будут полезны.

Другими словами, тот факт, что эти функции отображаются в API, не означает, что для них будет использоваться общий прецедент. Тем не менее, часто лучше предоставлять больше инструментов для взаимодействия с системой, чем меньше, поскольку это способствует созданию платформы.

Ответ 2

Разница на самом деле хорошо объясняется на странице документов для Memcache:: addServer

connect() делает прямое подключение к одному экземпляру memcached.

addServer() добавляет запись в пул серверов, которую использует расширение Memcache, но фактически не соединяется, пока вы не выполните что-то, что требует подключения.

При использовании этого метода (в отличие от Memcache:: connect() и Memcache:: pconnect()) сетевое соединение не устанавливается до фактического уровня. Таким образом, нет никаких накладных расходов при добавлении большого количества серверов в пул, хотя они могут не все использоваться.

Использование пула серверов означает, что если один экземпляр/соединение memcached вызывает ошибку низкого уровня, расширение Memcache автоматически подключится к другому серверу для выполнения запроса.

Ответ 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 идеально используется на одной установке хоста и никогда не с пулом, если не намерено говорить с конкретным хостом в пуле для получения статистики, операций технического обслуживания или специальных схем кэширования. Подробнее обсуждение здесь.