Кэширование объектов WordPress: Redis, Memcached и собственные API

Опубликовано: 2017-11-04

Сайты WordPress корпоративного уровня, которые могут масштабироваться по желанию, нуждаются в постоянном механизме кэширования помимо страниц и изображений, механизме, который может кэшировать фактические объекты PHP. Хотя WordPress предоставляет механизм кэширования объектов через WordPress Object Cache, существуют и другие решения, которые предлагают большие возможности и мощность. Но прежде чем мы углубимся во все это, сначала нам нужно увидеть, что такое кэширование объектов и как оно работает в PHP.

Что такое кэширование объектов?

PHP — это объектно-ориентированный язык. Он использует парадигму объекта для структурирования кода. В результате ваш сайт WordPress состоит из множества различных объектов PHP, которые постоянно создаются, создаются и уничтожаются (диспетчером памяти). Создание и уничтожение объектов требует дополнительных затрат, особенно если их много. Тем не менее, большинство из них, как правило, часто используются повторно, поскольку они представляют собой основные функции. Это означает, что каждый раз, когда приложение будет нуждаться в них снова, ему нужно будет создавать их экземпляры с самого начала.

Что, если бы вы могли кэшировать часто используемый экземпляр объекта, чтобы вам не нужно было постоянно его уничтожать и создавать?

Вы можете использовать функцию PHP serialise() для преобразования объекта или примитива в числовое представление (байтовый двоичный объект), которое можно сохранить в памяти или на диске для последующего доступа. Затем вы вычисляете хэш-номер байтового блоба с помощью функции hash() и сохраняете оба значения. Хэш в качестве ключа и большой двоичный объект в качестве значения. Чтобы получить его, вы используете вычисленный хеш-номер байтового BLOB-объекта, который изначально был сохранен в качестве ключа. Таким образом вы можете превратить что угодно (String, Integer, Object, Boolean, Array и т. д.) в хранимое представление значения.

Пример:

$serialized = serialize( array ( 'test' ));

Выполните обратную операцию с помощью unserialize():

$original = unserialize ( $serialized );

В общем, есть три способа кэширования объектов: использование собственного кэша объектов WordPress, Transients API или внешнего хранилища ключей и значений, такого как Redis или Memcached.

Кэширование объектов WordPress

WordPress предлагает два API для кэширования объектов: собственный кеш объектов WordPress и API Transients. Они идентичны, и хотя это может вызвать путаницу, за этим стоит логика.

Собственный кеш объектов WordPress может хранить объекты и примитивы в кеше, но не в постоянном режиме по умолчанию. Это означает, что кеширование происходит в памяти, а кешированные объекты не живут дольше жизненного цикла запроса. Таким образом, вы не можете делиться своими кэшированными объектами при разных загрузках страниц. Вам необходимо предоставить собственную реализацию магазина с использованием Drop-Ins, которые представляют собой «продвинутые» плагины, которые могут расширить функциональность WordPress. Вы можете увидеть их на панели управления WordPress в списке плагинов:

Плагины WordPress

С другой стороны, Transients API работает «из коробки». Вы можете сохранять переменные, массивы, объекты, связанные с датой истечения срока действия, непосредственно в базе данных и иметь постоянное кэширование объектов. Однако проблема в том, что по истечении срока действия кэшированных объектов они остаются в базе данных, занимая место. Это означает, что на обслуживание базы данных тратятся дополнительные накладные расходы, время от времени удаляя просроченные объекты.

WordPress определяет, внедрили ли вы свой собственный постоянный кеш объектов, и когда обнаруживает, что это так, вызовы API Transients обходят и перенаправляют в кеш объектов WordPress (и, следовательно, причина их идентичности).

Разработчики могут реализовать свой собственный кеш объектов, использовать плагин WordPress (подробнее о них позже) или нашу собственную реализацию, если это клиент Pressidium. У нас не включен кеш объектов по умолчанию, так как это может привести к снижению производительности при использовании в неправильной ситуации. Когда речь идет о кэшировании объектов на сайтах WordPress, универсального решения не существует.

Редис и Memcached

Хранилища пар "ключ-значение" не используют таблицы и предопределенные типы данных для хранения информации в записях, таких как в СУБД. Они предназначены для хранения и извлечения пар ключ/значение, как в словарных структурах данных, которые вы найдете в языках программирования.

Одним из прекрасных примеров такого хранилища является Redis. Помимо структур словарных данных, он поддерживает множество других, включая расширенные, такие как отсортированные наборы с запросами диапазона и геопространственные индексы с запросами радиуса. Он предлагает постоянное кэширование объектов .

Редис

Redis — это не просто хранилище ключей или кэш. Он поддерживает репликацию данных, сценарии, высокую доступность в конфигурации кластера. Вы также можете точно настроить желаемый уровень сохраняемости на диске. Преимущество Redis в том, что если вы сделаете перезагрузку, большая часть вашего кеша останется на диске, а потерянные данные будут лишь небольшой долей. Дело в том, что при перезагрузке серверу придется пересобирать кеш, а это в большинстве случаев увеличивает нагрузку. С Redis этого не происходит. Кроме того, объекты с истекшим сроком действия немедленно удаляются из базы данных. Здесь также нет накладных расходов на управление.

У Redis Labs есть отличная страница, демонстрирующая варианты использования Redis на предприятии: они варьируются от очень больших наборов данных до полнотекстового поиска, серий в реальном времени, интеграции Spark и многого другого.

Хотя все эти функции требуют сложности и, возможно, в некоторых случаях скорости, оптимизация кода Redis Drop-In может дать немало преимуществ. Не забывайте тот факт, что Redis выполняет постоянное кэширование объектов , чего нет в Memcached, хотя его гораздо проще использовать.

Memcached

Memcached — это высокопроизводительная система кэширования объектов в памяти, которая, согласно официальному веб-сайту, специально разработана для ускорения динамических веб-приложений и снижения нагрузки на базу данных. Он также намного проще и понятнее в использовании, чем Redis.

Благодаря тому, что он специально разработан для кэширования объектов для веб-страниц, а тот факт, что он использует базу данных в памяти, делает его самым быстрым решением для кэширования объектов. Однако, как мы упоминали ранее, если ваш сервер перезагружается, ваш кеш отсутствует. И пока он не будет восстановлен, вы, вероятно, будете испытывать повышенную нагрузку. Но, как говорят создатели: «думайте об этом как о кратковременной памяти для вашего веб-сайта», так что это скорее зависит от того, что вы хотите сделать в первую очередь.

Поскольку Memcached использует базу данных в памяти для хранения кеша, он очень эффективен при кэшировании SQL-запросов, выходных данных вызовов функций и т. д.

Плагины WordPress

  • WP Redis, официальный плагин Redis для WordPress. Поддерживает WP-CLI, кластеризацию и репликацию.
  • Redis Object Cache Еще один внутренний плагин Redis для WordPress.
  • Memcached Object Cache, серверная часть для Memcached.
  • Удалить просроченные переходные процессы, этот плагин удаляет просроченные переходные объекты из базы данных. Он также поддерживает мультисайты!

Как запустить бенчмарки

Цель нашей статьи — познакомить вас с кэшированием объектов и начать работать над ним самостоятельно. Вы можете попробовать различные реализации постоянного кэша и посмотреть, насколько хорошо ведет себя ваше приложение. Вы можете использовать функцию PHP microsecond() для сравнения вызовов. Например: вызовите microsecond( microsecond() до и после вызова wp_cache_get() , вычтите значения и сохраните результат. Сделайте это для различных реализаций кэша и посмотрите, в каких случаях вы заметите прирост производительности.

В Pressidium у нас не включено кэширование объектов по умолчанию, и, хотя это то, что можно запросить, мы обычно не рекомендуем его с самого начала. Мы проводим тесты и убеждаемся, что ваш сайт получит от этого пользу.

Вывод

Предположим, что для отображения страницы приложению необходимо прочитать 2000 временных объектов. Это означает 2000 операций чтения в базе данных. При использовании системы постоянного кэширования объектов эти 2000 операций чтения выгружаются в хранилище ключей и значений. Если вы используете memcached, вы рискуете потерять весь кеш при внезапном перезапуске. В целом, Redis может быть не таким быстрым, как Memcached, но его корпоративные функции и постоянство принесут вам пользу в долгосрочной перспективе.

Однако один размер не подходит всем! Например, мы видели экземпляры Redis, которые действительно замедляли работу веб-сайтов, а в других случаях они невероятно ускоряли их работу. Это связано с количеством объектов, которые использует ваше приложение: в общем, если ваше приложение использует несколько (скажем, дюжину), вы не получите большой выгоды от кэширования объектов, а в худшем случае вы имеют сетевые накладные расходы. Однако, если ваше приложение исчисляется сотнями, то стоит взглянуть.