веб-кэш
Веб-кеш — это HTTP-устройство, которое автоматически сохраняет копии обычных документов. Когда веб-запрос поступает в кеш, документ может быть извлечен с локального устройства хранения, а не с исходного сервера, если есть локальная кешированная копия.
1. Зачем нам кеширование?
- резервная передача данных
Когда многие клиенты посещают популярную страницу исходного сервера, сервер будет передавать один и тот же документ несколько раз, и каждый раз, когда он передается клиенту, одни и те же байты будут передаваться по сети снова и снова. Эти избыточные передачи данных могут использовать дорогую полосу пропускания сети. Благодаря кэшированию мы можем сохранить копию ответа с первого сервера, а последующие запросы могут обрабатываться кэшированной копией.
- узкое место в пропускной способности
Кэширование также может устранить узкие места в сети. Многие сети обеспечивают большую пропускную способность для клиентов локальной сети, чем для удаленных серверов. Клиент будет обращаться к серверу с самой низкой скоростью интернета на пути. Если клиент получает копию из кэша в быстрой локальной сети, кэш может повысить производительность, особенно при передаче больших файлов.
- Мгновенная перегрузка
Кэш очень важен, когда он перегружен в момент разрыва цикла. Чрезвычайные ситуации (такие как экстренные новости, массовые рассылки объявлений по электронной почте или событие со знаменитостями) представляют собой мгновенную перегрузку, когда многие люди получают доступ к веб-документу примерно в одно и то же время. Возникающие в результате чрезмерные всплески трафика могут привести к катастрофическим сбоям в работе сети и веб-сервера.
- дистанционная задержка
Даже если пропускная способность не является проблемой, расстояние может быть проблемой. Каждый сетевой маршрутизатор увеличивает задержку интернет-трафика, и даже если между клиентом и сервером не так много маршрутизаторов, сама скорость света может вызвать задержку. Размещение кэша в ближайшем компьютерном зале может сократить расстояние передачи файлов с тысяч миль до десятков метров.
2. Кэш попадает и промахивается
Но кеш не может хранить копии всех документов в мире, поэтому есть два случая:
- Некоторые запросы, поступающие в кеш, могут быть обслужены существующей копией, это называется попаданием в кеш.
- Другие запросы, поступающие в кеш, могут быть перенаправлены на исходный сервер, поскольку копия недоступна, что называется промахом кеша.
3. Правила определения свежести
HTTP хранит копию документа сервера в кэше в течение определенного периода времени. В течение этого времени документ считается свежим, и кэш может обслуживать документ напрямую, не связываясь с сервером. мы называем егоСильное попадание в кеш, браузер вернет код состояния 200 (из кеша)
Однако, если кэшированная копия остается слишком долго и превышает лимит свежести документа, срок действия документа считается просроченным.
Перед повторным предоставлением документа кэш должен повторно пройти аутентификацию на сервере, чтобы проверить, изменился ли документ. мы называем егоСогласовать кеш
-
При проверке: если объект сервера не был изменен, сервер отправит клиенту небольшой ответ HTTP 304 Not Modeified.
-
Промах повторной проверки: если объект сервера отличается от кешированной копии, сервер отправляет клиенту обычный ответ HTTP 200 ok с полным содержимым.
-
Объекты удаляются: если объект сервера был удален, сервер отправит 404 не найден ответа, а кэш будет удалять его копию.
4. Принцип сильного кеша
через специальный HTTPCache-Controlзаголовок иExpriesзаголовок, HTTP позволяет исходному серверу добавитьсрок годности, эти заголовки указывают, как долго контент может считаться свежим.
Когда браузер отправляет запрос на один и тот же ресурс во второй раз, он сравнивает время истечения срока действия с текущим временем. Если он до истечения срока действия, срабатывает надежный кэш. Если срок действия кэшированного документа истек, кеш должен свериться с сервер, чтобы узнать, истек ли срок действия документа. Если он был изменен, получить свежую копию (с новой датой истечения срока действия)
4.1 Сильный заголовок кэша
-
Cache-Control: max-age:
max-ageЗначение определяет максимальное время жизни документа — максимально допустимое время жизни (в секундах) с момента первого создания документа до тех пор, пока документ не станет свежим и непригодным для использования.
-
Expires:
Укажите абсолютную дату истечения срока действия.Если срок действия прошел, это означает, что документ уже не свежий, но поскольку мы можем изменить время клиента, мы можем изменить результат попадания в кеш. Поэтому мы предпочитаем использоватьCache-Control
Cache-Controlинструкция:
-
no-cacheа такжеno-store:
no-cacheУказывает, что возвращенный ответ должен быть подтвержден сервером, прежде чем его можно будет использовать для удовлетворения последующих запросов URL-адреса согласия. Итак, если есть подходящий токен аутентификации (ETag),no-cacheИнициируется круговой обход для проверки кэшированного ответа, но во избежание загрузки, если ресурс не изменился.
no-storeУказывает, что браузеру и всем промежуточным кэшам прямо запрещено хранить любую версию возвращаемого ответа, например, ответ, содержащий данные личной конфиденциальности или банковские данные. Каждый раз, когда пользователь запрашивает актив, на сервер отправляется запрос, и загружается полный ответ.
-
publicа такжеprivate:
publicПри наличии заголовка повторного ответа ответ может быть кэширован, даже если он связан с HTTP-аутентификацией, даже если код кода состояния ответа обычно не кэшируется. в большинстве случаев,publicНе требуется из-за явной информации о кэше (например,max-age) указал, что ответ кэшируется
Напротив, браузеры могут кэшироватьprivateотклик. Однако эти ответы обычно кэшируются только для одного пользователя, поэтому никакие промежуточные кэши не могут их кэшировать, например, браузер пользователя может кэшировать HTML-страницы, содержащие личную информацию пользователя, а CDN не может.
-
max-age:
Директива указывает максимальное время, разрешенное для повторного использования извлеченного ответа, начиная с момента запроса. Напримерmax-age=60Указывает, что ответ можно кэшировать и повторно использовать в течение следующих 60 с.
-
must-revalidate:
must-revalidateКэш без предварительной повторной проверки на исходном сервере не может предоставить устаревшую копию этого объекта, кеш по-прежнему свободен для предоставления новой копии. Если в кэшеmust-revalidateВо время проверки свежести исходный сервер недоступен, кеш должен возвращать ошибку 504
оптимальныйCache-ControlСтратегия:
5. Принцип согласования кэша
Тот факт, что кеш устарел, не означает, что он на самом деле отличается от документа, который в данный момент активен на исходном сервере, это просто означает, что пришло время проверить, ситуация называетсяСогласовать кеш, указывая на то, что кеш должен запрашивать изменения у исходного сервера.
-
Если ревалидация показывает, что содержимое изменилось, кэш получает новую копию документа, сохраняет ее там же, где и старый документ, и отправляет документ клиенту.
-
Если содержимое повторной проверки не изменилось, кэшу нужно только получить новый заголовок, включая новую дату истечения срока действия, обновить заголовок в кэше и обновить заголовок в кэше.
5.1 Повторная проверка с помощью условных методов
Условные методы HTTP могут эффективно реализовать повторную проверку. HTTP позволяет кешу отправлять условный GET на исходный сервер, запрашивая у сервера отправку обратно тела объекта только в том случае, если документ отличается от существующей копии в кеше, чтобы кеш мог проверить 2 наиболее полезных заголовка.
-
If-Modified-Since: <date>:
Если документ был изменен с указанной даты, выполните запрошенный метод. С участиемLast-ModfiedОн используется в сочетании с заголовком ответа сервера, и содержимое извлекается только в том случае, если содержимое изменено и отличается от кэшированной версии.
-
If-None-Match:<tags>:
Серверы могут предоставлять специальные теги для документов (ETag), вместо того, чтобы сопоставлять его с датой последнего изменения, эти метки действуют как серийные номера. Если кэшированный тег отличается от тега в документе сервера,If-None-MatchЗаголовок выполнит запрошенный метод
5.2 If-Modified-Since: / Last-Modified
Конкретный процесс выглядит следующим образом:
-
Когда клиент инициирует запрос к серверу в первый раз, сервер отправляет дату последней модификации (
Last-Modified) к предоставленному документу -
Когда время ресурса запрашивается снова, если сильный кеш не попал, он будет содержать
If-Modifed-SinceЗаголовок, содержащий дату последнего изменения кэшированной копии:If-Modified-Since: <cached last-modified data> -
Если содержимое было изменено, сервер отправляет обратно новый документ с кодом состояния 200 и последней датой изменения.
-
Если содержимое не было изменено, возвращается
304 Not Modifiedотклик
5.3 If-None-Match / ETag
В некоторых случаях повторной проверки с датой последнего изменения недостаточно.
-
Некоторые документы могут периодически переписываться (например: из фонового процесса), но по факту содержащиеся в них данные часто одни и те же, хотя содержание не меняется, но меняется дата модификации
-
Некоторые документы могли быть изменены, но модификация не важна, нет необходимости перезагружать данные во всемирный кэш (например, заполнение комментариев).
-
Некоторые серверы не могут точно определить дату последнего изменения их страниц.
-
Для некоторых серверов, которые обслуживают документы, которые изменяются с интервалом в миллисекунды (например, мониторы реального времени), даты изменения с точностью до одной секунды может быть недостаточно для этих серверов.
Таким образом, HTTP позволяет пользователямETag) сравниваются идентификаторы версий. Тег сущности — это произвольный тег (строка кавычек), прикрепленный к документу, а случайный токен, сгенерированный и возвращенный сервером, обычно представляет собой хэш или другой отпечаток содержимого документа. Клиенту не нужно, как был сгенерирован отпечаток, он просто отправляет его на сервер при следующем запросе. Если отпечаток остался прежним, ресурс не изменился и загрузку можно пропустить.
В приведенном выше примере клиент автоматически предоставляет токен ETAG в заголовке HTTP-запроса «IF-NONE-MATCH». Сервер проверяет токен в соответствии с текущим ресурсом. Если он не изменится, сервер вернет ответ 304 Not Modified, чтобы сообщить ответ браузера в кеше, который не изменяется, может быть продлен на 120 секунд. Обратите внимание, что вам не нужно загружать ответ снова, что экономит время и трафик.
Обновление и устаревшие ответы
Все HTTP-запросы, сделанные браузером, сначала направляются в кэш браузера, который, как было подтверждено, кэширует допустимый ответ на запрос. При наличии совпадающего ответа ответ считывается из кеша, что позволяет избежать задержек в сети и платы за трафик за доставку.
Но что, если мы обновим или отбросим кешированный ответ, например, у нас есть таблица стилей css, кэшированная на срок до 24 часов, но нам нужно немедленно обновить его, как мы можем уведомить всех посетителей об устаревшей кэшированной копии CSS для обновления своего кеша. Это невозможно сделать без изменения URL-адреса ресурса.
Итак, как можно добиться кеширования на стороне клиента и быстрого обновления, можно менять его URL при изменении содержимого ресурса, заставляя пользователя загружать новый ответ. Обычно этого можно добиться, внедрив отпечаток файла или номер версии в имя файла.
-
HTML помечен как
no-cache, что означает, что браузер всегда перепроверяет документ при каждом запросе и извлекает последнюю версию при изменении содержимого. Кроме того, отпечатки пальцев встраиваются в HTML-теги, CSS и javascript, если содержимое этих файлов изменится, HTML-код веб-страницы также изменится, и будет загружена новая копия HTML-ответа. -
Разрешить браузерам и промежуточным кэшам (например, CDN) кэшировать CSS и установить срок действия CSS через 1 год, поскольку отпечаток файла встроен в имя файла, а URL-адрес изменяется при обновлении CSS.
-
Срок действия JavaScript также истекает через 1 год, но он помечен как
private, что может быть связано с тем, что он содержит некоторые личные данные пользователя, которые CDN не должна кэшировать. -
Изображения кэшируются без версии или уникального отпечатка пальца, срок действия которых истекает через день.