Объектное кеширование может серьезно повысить производительность вашего WordPress сайта/ Попробуем разобраться, в каких условиях 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 действительно может быть полезен:
- Если вам нельзя кешировать содержимое сайта стандартными плагинами, потому что оно меняется в зависимости от действий пользователя.
- Сайт работает медленно из-за большой нагрузки на базу данных. Используя объектный кеш, запросы в базу данных происходят гораздо реже, при этом извлекаются данные из Redis гораздо быстрее (так как получаются из оперативной памяти, а не с жесткого диска), в сравнении со стандартным запросом.
- Нужно более эффективно использовать ресурсы сервера. Это особенно важно при масштабировании.
- Когда сайт начинает работать медленнее при увеличении количества пользователей на сайте.
Ускоряет ли Redis WordPress
Не всегда! Чтобы ускорить работу сайта необходимо выполнить некоторые требования:
- Нельзя использовать одновременно со стандартными плагинами кеширования (либо плагин кеширования должен работать не на всех страницах). Например, на сайтах, где содержимое страницы должно меняться в зависимости от действий пользователя. В интернет-магазинах, форумах, веб-приложениях и т.п.
- Ускорения не будет, если время генерации страницы больше 0,5 секунды или увеличено за счет большого количество одновременного доступа пользователей.
- Ускорения не будет, если время на запросы к базе данных выше, чем скорость генерации страницы, или же когда у вас большое количество одновременных пользователей (больше 200).
Все перечисленные пункты могут влиять на производительность Redis. Дальше мы разберем, как проанализировать работу сайта и время, которое ему требуется на генерацию страницы.
Как проанализировать время генерации страницы WordPress
Для того, чтобы проанализировать время генерации страницы сайта, можно воспользоваться плагином Query Monitor, он помогает выявить проблемы с производительностью.
Данный плагин помимо времени генерации также показывает, сколько было выполнено запросов к базе данных, и сколько времени этот процесс занял.
Ниже приведем пример, где можно определить ключевые показатели при работе без Redis:
- время генерации страницы: 0,2926 с
- запросы к базе данных: Всего: 132
- Object Cache: плагин не установлен
Поможет ли Redis сократить время генерации страницы
В данном примере мы видим, что есть 132 запроса к базе данных, на первый взгляд, это много, но так как нашему серверу необходимо всего 0,0193 секунды на выполнение этих запросов, проблем с работоспособностью не возникает.
И в этом случае Redis Cache поможет нам лишь сократить время выполнения этих 0,0193 секунд. В этом случае использование 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