HTTP-кэш

внешний интерфейс HTTP
HTTP-кэш

«Это 18-й день моего участия в первом испытании обновлений 2022 года. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г."

предисловие

Кэширование — это метод сохранения копии ресурса и использования этой копии непосредственно при следующем запросе.

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

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

Типы кэширования HTTP

Как правило, существует две стратегии кэширования HTTP:

  • Сильный кеш
  • Согласовать кеш.

Из буквального значения мы можем интуитивно увидеть разницу между ними:

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

Сильный кеш

Сильный кеш не отправляет запрос на сервер, а считывает ресурс непосредственно из кеша.Вы можете видеть, что запрос возвращает код состояния 200 в сетевой опции консоли chrome, иsizeпоказыватьfrom disk cacheилиfrom memory cache;

Согласовать кеш

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

Управление кешем HTTP

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

Сильный кеш может быть установленExpiresа такжеCache-ControlДве реализации заголовка ответа. Если оба существуют,Cache-Controlприоритет надExpires.

Expires

Заголовок ответа с истекающим сроком действия, который является артефактом HTTP/1.0. Представляет время истечения срока действия ресурса, а его значение — абсолютное время. Он сообщает браузеру о доступе к данным непосредственно из кеша браузера до истечения срока действия. Поскольку это абсолютное время, такие факторы, как разница во времени или ошибка между клиентом и сервером, могут привести к тому, что время между клиентом и сервером будет несогласованным, что приведет к ошибке попадания в кэш. если вCache-ControlЗаголовок ответа установленmax-ageилиs-max-ageинструкция, тоExpiresбудет игнорироваться.

Expires: Wed, 21 Oct 2015 07:28:00 GMT

Cache-Control

Cache-ControlПоявился в HTTP/1.1. Механизм кэширования можно реализовать, указав несколько директив. В основном используется для указания максимального эффективного времени кэширования ресурсов. То есть в течение этого временного промежутка клиенту не нужно отправлять запрос на сервер. Приоритет выше, чем Expires. Значением его инструкции времени истечения является относительное время, что решает проблему абсолютного времени.

Cache-Control: max-age=315360000

Cache-ControlЕсть много атрибутов, и разные атрибуты представляют разные значения.

кешируемость

  • publicУказывает, что ответ может кэшироваться любым объектом (в том числе: клиентом, отправляющим запрос, прокси-сервером и т. д.).
  • privateУказывает, что ответ может кэшироваться только одним пользователем, а не как общий кеш (т. е. прокси-сервер не может его кэшировать).
  • no-cacheНе используйте надежный кеш, вам необходимо согласовать проверку кеша с сервером.
  • no-storeКэш не должен хранить ничего о клиентских запросах или ответах сервера, т.е. кеш не используется.

Истекший

  • max-age=<seconds>Максимальный срок хранения кеша, по истечении которого он считается просроченным.
  • s-maxage=<seconds>Настройте общий кеш. будет охватыватьmax-ageа такжеexpires, приватный кеш его проигнорирует
  • max-stale[=<seconds>]Клиент готов получить ресурс с истекшим сроком действия и может установить необязательное количество секунд, указывающее, что ответ не может быть устаревшим по истечении этого заданного времени.
  • min-fresh=<seconds>Клиент хочет получить последний ответ в течение указанного времени

Подтвердить и перезагрузить

  • must-revalidateЕсли срок действия страницы истек, перейдите на сервер, чтобы получить ее.
  • proxy-revalidateа такжеmust-revalidateРаботает так же, но для общего кэша.

разное

  • only-if-cachedНикаких сетевых запросов не делается, только кеш используется полностью.
  • no-transformРесурс не должен трансформироваться и преобразовываться. Например, нельзя преобразовывать форматы изображений.

Кэш согласования можно передать черезLast-Modified/If-Modified-Sinceа такжеETag/If-None-MatchЭти две пары заголовков для управления.

Last-Modified, If-Modified-Since

Last-Modifiedа такжеIf-Modified-SinceЗначение представляет собой строку времени в формате GMT, которая является временем окончательного изменения файла.

  1. Когда сервер ответит на запрос, он пройдетLast-ModifiedСообщает браузеру, когда ресурс был изменен в последний раз.
  2. Когда браузер снова запрашивает сервер, заголовок запроса будет содержатьLast-Modifiedполе, за которым следует время последней модификации, полученное в кэше.
  3. Сервер получает этот заголовок запроса сif-Modified-Since, затем сравните его со временем последней модификации запрошенного ресурса, если оно непротиворечиво, верните 304 и заголовок ответа, а браузеру останется только получить информацию из кеша. Если он был изменен, то начать передачу ответа целиком, сервер возвращает: 200 OK

Однако на сервере часто возникает такая ситуация: ресурс модифицируется, а его фактическое содержимое не меняется вообще.Last-ModifiedВремя не совпадает, и клиенту возвращается весь объект (даже если клиентский кеш имеет точно такой же ресурс). Для решения этой проблемы был введен HTTP/1.1.Etag. Etag имеет высокий приоритет иLast-Modified.

Etag, если не совпадает

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

Когда запрос делается в браузере, заголовок запроса браузера будет содержатьIf-None-Matchполе, значение которого было возвращено последнимEtagОно отправляется на сервер, и сервер находит после получения вторичного сообщенияIf-None-MatchОн сравнивается с уникальным идентификатором запрашиваемого ресурса. Если то же самое указывает на то, что ресурс не был изменен, ответ возвращает 304, и браузер получает информацию о данных непосредственно из кеша. Если он отличается, это означает, что ресурс был изменен, и он отвечает на все содержимое ресурса и возвращает код состояния 200.

Суммировать

Из предыдущей статьи мы узнали, что основными моментами кэширования HTTP являются:

  • Принудительно кэшировать
  • Согласовать кеш.

Принудительное кэшированиеCache-Control,Exipres(HTTP1.0) управления. Браузер напрямую считывает локальный кеш и больше не будет взаимодействовать с сервером Код состояния 200.

Согласованный кешLast-Modified / IfModified-Since,Etag /If-None-MatchРеализация, каждый запрос должен позволить серверу определить, был ли обновлен ресурс, чтобы определить, использует ли браузер кеш, если да, вернуть 304, в противном случае завершить ответ еще раз.

~

~ Эта статья окончена, спасибо за прочтение!

~

Получайте интересные знания, встречайте интересных друзей и формируйте интересные души!

Привет всем, я〖Программирование самадхи〗авторКороль-затворник, мой официальный аккаунт "Программирование самадхи』, пожалуйста, обратите внимание, я надеюсь, что вы можете дать мне больше советов!