Что такое кэшированные данные? Что означает «Очистить кеш» и для чего он нужен?

Во-первых, что такое кеш?

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

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

Отличие кеша от других типов репозиториев

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

В этой статье будут рассмотрены два распространенных метода кэширования: кеширование браузера и сети доставки контента (CDN).

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

Например, Amazon Glacier - это хранилище данных, предназначенное для дешевого хранения данных, но не для быстрого их извлечения. База данных SQL, с другой стороны, разработана так, чтобы быть гибкой, актуальной и быстрой, но она редко бывает дешевой и обычно не такой быстрой, как кэш.

Кэш браузера: кеш памяти

Кэш памяти хранит ресурсы локально на компьютере, на котором запущен браузер. Пока браузер активен, полученные ресурсы будут храниться в физической памяти (ОЗУ) компьютера и, возможно, также на жестком диске.

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

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

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

Как браузер узнает, что в кеше устарело?

Ответ непрост, но есть два основных подхода: очистка кеша и поля заголовка HTTP.

кэширование

Итальянцы

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

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

Скажем, у меня есть веб-страница, на www.foobar.com/about.htmlкоторой рассказывается о foobar.com все, что вы когда-либо хотели бы знать. После посещения этой страницы она и связанные с ней ресурсы кешируются браузером.

Позже foobar.com выкупает корпорация Quxbaz, и содержание страницы about претерпевает существенные изменения. В кеше браузера не будет этого нового содержимого, но он все равно может верить, что содержимое у него является текущим, и никогда не будет пытаться его повторно загрузить.

Что вы, как веб-администратор Quxbaz, делаете, чтобы весь новый контент был удален?

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

Таким образом, изменив URI ресурса с www.foobar.com/about.htmlна www.foobar.com/about2.html(или на www.quxbaz.com/about.html), браузер не найдет никаких ресурсов кэша, связанных с этим URI, и выполнит полную выборку с сервера. Ресурс может быть практически таким же, как оригинал под старым URI, но браузер этого не знает.

Однако вам не нужно менять имя страницы. Поскольку URI также включает в себя строку запроса , по определению, вы можете добавить параметр версии в URI: www.foobar.com/about.html?v=2hef9eb1.

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

Ни один из этих методов не сработает, если к старому URI осуществляется прямой доступ из закладки. Если браузеру не было дано указание повторно проверить URI в последнем кешированном запросе (или если срок действия кэшированного ресурса истек), он не будет выполнять полную выборку для обновления своего кеша. Это подводит нас к следующей теме.

Поля HTTP-заголовка

Каждый запрос ресурса поставляется с некоторой метаинформацией, известной как заголовок. И наоборот, каждый ответ также имеет связанную с ним информацию заголовка.

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

HEAD запросы и условные запросы

Запрос HEAD похож на усеченный запрос GET или POST. Вместо запроса всего ресурса запрос HEAD запрашивает только поля заголовка, которые в противном случае были бы возвращены при полном запросе.

Заголовок ресурса обычно будет намного меньше (по общему количеству байтов), чем связанные с ним данные ресурса («тело» ответа). Информация заголовка достаточно информативна, чтобы браузер мог определить актуальность ресурса в своем кэше.

Запросы HEAD часто используются для проверки достоверности ресурса сервера (то есть существует ли ресурс, и если да, обновлялся ли он с момента последнего обращения к нему браузера?). Браузер будет использовать то, что находится в его кеше, если запрос HEAD указывает, что ресурс действителен, в противном случае он выполнит полный запрос GET или POST и обновит свой кеш тем, что возвращается.

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

Если это так, сервер возвращает ответ 304 только с информацией заголовка ресурса и без тела ресурса (данных). Если установлено, что кеш браузера устарел, сервер вернет полный ответ 200 OK.

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

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

Кэш-контроль

При ответе на запрос сервер отправляет в браузер поля заголовка, указывающие, какое поведение следует адаптировать при кэшировании. Если я загружаю страницу по адресу //en.wikipedia.org/wiki/Uniform_Resource_Identifier, ответ будет содержать это в записи заголовка:

cache-control: private, s-maxage=0, max-age=0, must-revalidate 

private означает, что только браузер должен кэшировать содержимое документа.

s-maxage и max-age установлены на 0 . Значение s-maxage предназначено для прокси-серверов с кешами, тогда как max-age предназначено для браузера. Эффект установки максимального возраста в одиночку , что кэшированный ресурс истекает сразу, но все еще можно использовать (даже черствый) во время обновления страницы в то время как в том же сеансе браузера.

Устаревший ресурс может быть повторно подтвержден посредством запроса HEAD, за которым может следовать запрос GET или POST, в зависимости от ответа. Обязательно перепроверить директиву команды браузера перепроверить кешированный ресурс , если он является устаревшим.

Поскольку в этом случае max-age установлен в 0 , кэшированный ресурс сразу становится устаревшим после получения. Комбинация двух директив эквивалентна единственной директиве no-cache .

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

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

E-tag

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

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

Другие теги заголовков, влияющие на кеширование

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

expires: Thu, 01 Jan 1970 00:00:00 GMT last-modified: Sun, 01 Mar 2020 17:59:02 GMT 

Здесь истечение срока устанавливается на нулевую дату (исторически сложилось в операционной системе UNIX). Это означает, что ресурс истекает немедленно, как и max-age = 0 . Последнее изменение сообщает браузеру, когда было выполнено последнее обновление ресурса, которое он затем может использовать, чтобы решить, следует ли его повторно загрузить, а не использовать значение кеша.

Принудительное обновление кеша из браузера

Что за жесткая перезагрузка?

Жесткая перезагрузка приводит к повторной загрузке всех ресурсов на странице, будь то контент, скрипты, таблицы стилей или медиа. Практически все, правда?

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

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

Что такое очистка кеша и жесткая перезагрузка?

Эта операция очищает весь кеш браузера, что имеет тот же эффект, что и жесткая перезагрузка, но дополнительно вызывает также выборку динамически загружаемых ресурсов - в конце концов, в кеше ничего нет, поэтому выбора нет!

Сети доставки контента: геолокационный кеш

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

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

CDN получает свои ресурсы через Internet Exchange Point (IXP), узлы, которые являются частью магистрали Интернета (заглавными буквами). Есть шаги, которые необходимо предпринять, чтобы настроить маршрутизацию запросов для перехода к CDN вместо хост-сервера. Следующий шаг - убедиться, что в CDN есть актуальное содержимое вашего веб-сайта.

Раньше большинство CDN поддерживали метод push: веб-сайт отправлял новый контент в концентратор CDN, который затем распределялся по географически разнесенным узлам.

В настоящее время большинство CDN используют протоколы кэширования, описанные выше (или аналогичные), для 1) загрузки новых ресурсов и 2) обновления существующих. У браузера по-прежнему есть кеш, и ничего из этого не меняется. Все, что делает CDN, - это ускоряет передачу новых ресурсов.