Объектный кэш Redis для WordPress

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

Что такое объектный кэш Redis?

Redis – это open source хранилище структур данных (ключей базы данных), который работает в оперативной памяти сервера в качестве кэша.

WordPress, используя данный кэш, сохраняет в памяти результаты запросов к базе данных, минимизирует их количество и, соответственно, время отклика сайта.

Важно понимать, что объектный кэш отличается от привычного нам кэширования HTML содержимого. WP Fastest Cache, WP-Rocket, LiteSpeed Cache и тому подобные плагины кэширования увеличивают скорость загрузки сайта, сохраняя статическую копию HTML-страницы, пропуская выполнение PHP кода. Redis кэширует содержимое базы данных, минимизируя количество запросов к ней, пропуская шаг прямого обращения в базу данных.

Как Object Cache работает с WordPress?

Object Cache использует полученные результаты запросов к базе данных. Обслуживание подобных запросов происходит быстрее, так как у клиента больше нет необходимости повторно запрашивать данные напрямую.

WordPress имеет встроенный Object Cache с классом Core WP_Object_Cache. Но проблема в том, что объектное кэширование в WordPress по умолчанию не является постоянным.

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

Нужен ли мне Redis в WordPress?

Чтобы ответить на этот вопрос, перечислим ситуации, в которых Redis действительно может быть полезен:

  1. Если вам нельзя кэшировать содержимое сайта стандартными плагинами, потому что оно меняется в зависимости от действий пользователя.
  2. Сайт работает медленно из-за большой нагрузки на базу данных. Используя объектный кэш, запросы в базу данных происходят гораздо реже, при этом извлекаются данные из Redis гораздо быстрее (так как получаются из оперативной памяти, а не с жесткого диска), в сравнении со стандартным запросом.
  3. Нужно более эффективно использовать ресурсы сервера. Это особенно важно при масштабировании.
  4. Когда сайт начинает работать медленнее при увеличении количества пользователей на сайте.

Ускоряет ли Redis WordPress?

Не всегда! Чтобы ускорить работу сайта необходимо выполнить некоторые требования:

  1. Нельзя использовать одновременно со стандартными плагинами кэширования (либо плагин кэширования должен работать не на всех страницах). Например, на сайтах, где содержимое страницы должно меняться в зависимости от действий пользователя. В интернет-магазинах, форумах, веб-приложениях и т.п.
  2. Ускорения не будет, если время генерации страницы больше 0,5 секунды или увеличено за счет большого количество одновременного доступа пользователей.
  3. Ускорения не будет, если время на запросы к базе данных выше, чем скорость генерации страницы, или же когда у вас большое количество одновременных пользователей (больше 200).

Все перечисленные пункты могут влиять на производительность Redis. Дальше мы разберем, как проанализировать работу сайта и время, которое ему требуется на генерацию страницы.

Как проанализировать время генерации страницы WordPress?

Для того, чтобы проанализировать время генерации страницы сайта, можно воспользоваться плагином Query Monitor, он помогает выявить проблемы с производительностью.

Данный плагин помимо времени генерации также показывает, сколько было выполнено запросов к базе данных, и сколько времени этот процесс занял.

Ниже приведем пример, где можно определить ключевые показатели при работе без Redis:

  • время генерации страницы: 0,2926 с
  • запросы к базе данных: Всего: 132
  • Object Cache: плагин не установлен
Время генерации страницы 0,2962 с и 132 запроса к базе данных без Redis.

Поможет ли Redis сократить время генерации страницы?

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

И в этом случае Redis Cache поможет нам лишь сократить время выполнения этих 0,0193 секунд. В этом случае использование Redis того не стоит, только если нет большого количество параллельных запросов в БД.

Если время выполнения запросов невелико, Redis поможет только в случаях большого кол-ва одновременных запросов.

Проверка производительности при использовании Redis

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

Для начала проверим время генерации страницы с использованием Redis.

Время генерации страницы с использованием Redis

Результаты показали:

  • время генерации страницы: 0,2736 с
  • запросы к базе данных: Всего: 31
  • Object Cache: 99,3% обращений

В итоге получилось, что время генерации страницы сократилось до менее чем 20 миллисекунд. В целом, это низкое значение, чтобы его можно было принимать во внимание. При этом стоит заметить, что количество запросов к базе данных сократилось с 132 до 31 запроса, и x4 прирост в скорости будет ощутимым при большом кол-во параллельных запросов.

Из этого можно сделать вывод: Redis значительно уменьшает нагрузку на базу данных, что серьезно помогает в условиях высокого параллелизма пользователей.

Как подключить Redis к WordPress?

Прежде всего стоит начать с установки и настройки службы Redis на сервер. Далее устанавливается расширение Redis для PHP, а затем уже сам плагин в WordPress.

Самый простой способ установки для WordPress

1. Установите и настройте службу Redis.

При использовании дистрибутива Ubuntu нужно выполнить следующую команду в терминале:

sudo apt install redis

Далее,  внесём настройку в /etc/redis/redis.conf для максимально быстрой работы, активировав подключение через сокеты:

# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
unixsocket /var/run/redis/redis.sock
unixsocketperm 777

Далее настраиваем memory limit и memory policy, а затем Redis, так, чтобы он работал исключительно в памяти, не сохраняя данные на диск.

############################## MEMORY MANAGEMENT ################################

# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).

maxmemory 128mb


# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
maxmemory-policy allkeys-lru

...

################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
save ""

Затем можно перезапустить Redis, чтобы применить настройки:

sudo systemctl restart redis.service

Далее проверяем статус Redis с помощью команды:

sudo systemctl status redis

2. Установка модуля PHP Redis

При использовании дистрибутивов Ubuntu или Debian, можно установить модуль Redis с помощью команды: apt-get install.

apt-get update
apt-get install php7.4-redis

phpinfo(), показывает установленный PHP с включенным модулем «Redis».

3. Установка плагина Redis Object Cache в WordPress

Из админки WordPress устанавливаем новый плагин Redis Object Cache.

Активируем плагин и переходим к настройкам Redis (Настройки > Redis).

Нажимаем на кнопку «Включить объектный кэш», активируя Redis с настройками по умолчанию

4. Включить сокетное соединение с Redis для повышения производительности.

Когда вы используете службу Redis на сервере рядом с вашим сайтом, наиболее эффективным методом подключения, будет подключение через сокет UNIX.

А чтобы настроить плагин Redis для подключения через сокет, нужно будет определить две константы через wp-config.php:

define( 'WP_REDIS_PATH', '/var/run/redis/redis.sock' );
define( 'WP_REDIS_SCHEME', 'unix' );

Примечание. Нужно изменить путь WP_REDIS_PATH, чтобы он указывал на настоящий сокет Redis.

Использование плагина Redis

В панели администратора WordPress нужно открыть метрическую статистику:

Вкладка «Метрики» показывает впечатляющее время ответа на запросы Redis: менее 4 миллисекунд.

Через этот плагин мы также имеем возможность сбросить кэш в разделе «Overview».

Кэш Redis Flush

Обычно нет необходимости чистить кэш Redis. При этом бывают случаи, когда это единственный вариант, если серверные операции не работают должным образом. Опция Flush Cache предназначена только для объектного кэша и никак не влияет на кэшированное HTML содержимое, создаваемое WP Rocket, LiteSpeed Cache и т.п. 

Заключение

Благодаря Redis, мы можем увеличить скорость генерации страниц сайта, в случаях, когда существует узкие места в базе данных или присутствует высокий уровень параллелизма пользователей на динамических страницах.

Теперь каждый раз, когда ваш веб-сервер получает запросы к базе данных, он будет отдавать кэшированные данные прямо из оперативной памяти для экономии ресурсов. Если запрошенные данные не кэшируются через Redis, веб-сервер будет извлекать их и обрабатывать данные из базы, как обычно. Таким образом, кэш Redis значительно снижает нагрузку на сервер и делает работу вашего сайт гораздо быстрее.

Автор статьи: Алексей Гончаров, e-commerce  full-stack разработчик, основатель digital агентства Readycode и Sellum.co

Что будем искать? Например,VPS-сервер

Мы в социальных сетях