«Это 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, которая является временем окончательного изменения файла.
- Когда сервер ответит на запрос, он пройдет
Last-ModifiedСообщает браузеру, когда ресурс был изменен в последний раз. - Когда браузер снова запрашивает сервер, заголовок запроса будет содержать
Last-Modifiedполе, за которым следует время последней модификации, полученное в кэше. - Сервер получает этот заголовок запроса с
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, в противном случае завершить ответ еще раз.
~
~ Эта статья окончена, спасибо за прочтение!
~
Получайте интересные знания, встречайте интересных друзей и формируйте интересные души!
Привет всем, я〖Программирование самадхи〗авторКороль-затворник, мой официальный аккаунт "Программирование самадхи』, пожалуйста, обратите внимание, я надеюсь, что вы можете дать мне больше советов!