Кэш: все, что вам нужно знать

Кэш: все, что вам нужно знать

4 ноября 2022 г.

В мире, где веб-сайты должны быть быстрыми, и все кричат, чтобы оптимизировать все, есть одна вещь, которая всегда упоминается: "кеш". Но что это такое, как это работает и какие существуют уровни кеша?


Что такое кэш?

<цитата>

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

источник: Википедия

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

Например, простой веб-сайт WordPress будет выполнять несколько запросов к базе данных, циклически обрабатывать результаты, помещать все в правильную структуру и разметку, и только после этого он отправит все данные (сразу) обратно в браузер.

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

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

Как это работает?

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

Когда браузер делает запрос (вводит URL-адрес или щелкает ссылку), он отправляется на сервер. Система кэширования перехватит этот запрос и проверит, знает ли она уже, что должно быть возвращено в качестве ответа.

Если это так, он остановит обычный запрос и отправит имеющиеся у него данные прямо в браузер.

Если у него нет кэшированного ответа, он будет ждать, пока сервер обработает запрос, и поймает ответ, пока он отправляется обратно в браузер.

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

Но что происходит, когда ответ больше недействителен?

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

Это может быть как миллисекунды, так и годы, если это необходимо или нужно.

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

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

Множество методов и уровней кэширования

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

Кэширование на уровне сервера

Кэширование кода операции PHP

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

При кэшировании кода операции код из сценариев сохраняется в памяти сервера для более быстрого доступа, поскольку чтение данных из памяти происходит намного быстрее, чем с диска. Некоторые известные механизмы — OPcache, APC и Xcache.

Кэш объектов

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

Для этого обычно используются Redis и Memcached.

Кэш страницы

Название говорит само за себя, он сохраняет полную (HTML) страницу в кэше, поэтому он возвращает все сразу, без необходимости компилировать код или выполнять (тяжелые) запросы к базе данных. Например, это могут сделать Nginx и Redis.

Ускоритель веб-сервера

Ускоритель веб-сервера, иногда называемый обратным прокси-сервером или контроллером доставки приложений, делает то же самое, что и кэширование страниц, за исключением того, что он работает до того, как сработает программное обеспечение сервера.

Это означает, что серверу нужно сделать еще меньше, и, следовательно, больше ресурсов доступно для других запросов. Лак — один из самых распространенных инструментов.

Сеть доставки контента (CDN)

CDN работает иначе, чем описанные выше типы кэширования, поскольку (обычно) не обрабатывается тем же сервером, на котором работает веб-сайт/приложение.

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

В некоторых случаях можно даже получить доступ к файлам, которые используются на нескольких веб-сайтах, что делает кеш браузера еще более оптимальным.

Кэширование на уровне приложения

Кэширование браузера

Установив минимальное (или максимальное) время жизни ресурса на сервере, браузер не только загрузит файл, но и сохранит его локально. Таким образом, в следующий раз, когда потребуется тот же файл, он просто возьмет сохраненную версию, а не загрузит ее снова с сервера.

Все браузеры делают это по умолчанию, но для этого требуются правильные настройки на сервере (или CDN).

Другие типы?

Предварительная выборка кэша

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

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

Можно выполнить 2 типа предварительной выборки: Предварительная выборка DNS и Предварительная выборка контента. При предварительной выборке DNS извлекаются только записи DNS, что означает IP-адрес и местоположение (через лабиринт серверов по всему миру) собираются и хранятся.

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

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

Итак, что мне нужно?

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

Однако многое уже было настроено при использовании хорошего хостинг-провайдера, плагинов/расширений для вашей CMS/фреймворка и стандартных настроек.

Следует помнить о сложности вашего проекта и о том, насколько динамичным он должен быть. Кэширование наиболее полезно для статического контента, особенно Page Cache и CDN.

Если у вас много динамического контента (например, страница поиска с большим количеством различных фильтров), лучше использовать кэширование более высокого уровня, например Object Cache.


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE