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