Кэш согласования http против сильного кеша

JavaScript

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

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

1. Кэш браузера

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

Когда браузер впервые запрашивает:

Когда браузер делает последующий запрос:

 

Как видно из рисунка выше, кеш браузера бывает двух типов, а именно сильный кеш (также называемый локальным кешем) и согласованный кеш.После первого запроса браузер снова запрашивает:

  • Когда браузер запрашивает ресурс, вы сначала получите информацию HEADER кеша ресурсов и определите, попали ли вы в сильный кеш (информация об управлении кешем и expiRES), если вы получаете информацию о ресурсе непосредственно из кеша, включая заголовок кеша. информация; на этот раз запрос вообще не будет обмениваться данными; просмотрите JS-файл надежного кеша с ресурсом сильного кеша, возвращаемый Firebug, например JS-файл надежного кеша, просматриваемый локальным Firebug



  • Если сильный кеш не попал, браузер отправит запрос на сервер, и запрос будет содержать информацию о кэшированном поле заголовка (Last-Modified/If-Modified-Since и Etag/If-None-Match), возвращенную первый запрос.Сервер сравнивает результат в соответствии с соответствующей информацией заголовка в запросе, чтобы определить, попал ли кэш; если он попадает, сервер возвращает новую информацию заголовка ответа, чтобы обновить соответствующую информацию заголовка в кеше, но не возвращает содержимое ресурса, он сообщит браузеру, что он может напрямую получить из кеша; в противном случае вернет самое последнее содержимое ресурса

Разницу между сильным кешем и кешем согласования можно описать в следующей таблице:

  Получить форму ресурса код состояния отправить запрос на сервер
Сильный кеш получить из кеша 200 (из кеша) Нет, получить напрямую из кеша
Согласовать кеш получить из кеша 304 (без изменений) Да, как следует из названия, сообщите серверу, доступен ли кеш

 

2. Сильные поля заголовка, связанные с кешем

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

  1. expires, это спецификация http1.0, его значением является строка времени в формате GMT ​​абсолютного времени, например Mon, 10 Jun 2015 21:31:12 GMT, если время отправки запроса раньше истечет, то локальный кеш Всегда действителен, в противном случае на сервер отправляется запрос на получение ресурса

  2. управление кешем: max-age=число, это информация заголовка, которая появляется в http1.1, о ней в основном судят по значению max-age этого поля, которое является относительным значением; время первого запроса ресурса и срок действия, установленный Cache-Control рассчитывается время истечения ресурса, а затем сравниваем это время истечения с текущим временем запроса. Если время запроса раньше срока истечения, то кэш может попасть, иначе он не будет работать, в дополнение к этому полю cache-control также имеет следующие наиболее часто используемые настройки:

    • no-cache: не использовать локальный кеш. Необходимо использовать согласование кеша и сначала подтвердить с сервером, был ли изменен возвращаемый ответ.Если в предыдущем ответе есть ETag, запрос будет проверен с сервером.Если ресурс не был изменен, повторно -загрузки можно избежать.

    • no-store: Напрямую запретить браузеру кешировать данные.Каждый раз, когда пользователь запрашивает ресурс, запрос будет отправлен на сервер, и каждый раз будет загружаться весь ресурс.

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

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

Примечание. Если Cache-Control существует, Cache-Control выше, чем Expires.

3. Согласуйте поля заголовка, связанные с кешем

При согласованном кэшировании сервер определяет, доступен ли кэшированный ресурс, поэтому клиент и сервер должны взаимодействовать через определенный идентификатор, чтобы сервер мог определить, можно ли кэшировать запрошенный ресурс и получить к нему доступ, что в основном включает следующие два наборы полей заголовка.Эти два набора партнеров отображаются парами, то есть заголовок ответа первого запроса содержит определенное поле (Last-Modified или Etag), а последующие запросы будут содержать соответствующее поле запроса (If-Modified-Since или If-Modified). -Since или If-None-Match), если заголовок ответа неПоследнее изменение или Etagполе, в заголовке запроса не будет соответствующего поля.

  1. Last-Modified/If-Modified-Since
    Значения обоих представляют собой временные строки в формате GMT ​​Конкретный процесс:
      • Браузер запрашивает ресурс у сервера в первый раз. Когда сервер возвращает ресурс, он добавляет заголовок Last-Modified к заголовку ответа, который указывает время последней модификации ресурса на сервере.

      • Когда браузер снова запрашивает ресурс с сервера, он добавляет заголовок If-Modified-Since к заголовку запроса, значением этого заголовка является значение Last-Modified, возвращенное в предыдущем запросе.

      • Когда сервер снова получит запрос ресурса, он оценит, изменился ли ресурс в соответствии с If-Modified-Since, отправленным браузером, и временем последней модификации ресурса на сервере.Если изменений нет, он вернет 304 Not Modified, но содержимое ресурса не будет возвращено, если есть изменение, содержимое ресурса будет возвращено в обычном режиме. Когда сервер возвращает ответ 304 Not Modified, заголовок Last-Modified не будет добавлен к заголовку ответа, потому что, поскольку ресурс не изменился, Last-Modified не изменится.Это ответ, когда сервер возвращает 304. заголовок

      • После того, как браузер получает ответ 304, он загружает ресурс из кеша.

      • Если согласованный кеш не срабатывает, когда браузер загружает ресурс непосредственно с сервера, заголовок Last-Modified будет обновлен при перезагрузке, а If-Modified-Since активирует последнее возвращенное значение Last-Modified в следующем запрос

  2. Etag/If-None-Match
    Эти два значения являются уникальной строкой идентификации каждого ресурса, сгенерированного сервером, и это значение будет меняться до тех пор, пока изменяется ресурс; процесс оценки такой же, какLast-Modified/If-Modified-SinceТочно так же, в отличие от Last-Modified, когда сервер возвращает ответ 304 Not Modified, поскольку ETag был перегенерирован, ETag будет возвращен в заголовке ответа, даже если ETag не изменился по сравнению с предыдущим.

4. Последняя модификация Хэ Шэн Этаг

Вы можете подумать, что использования Last-Modified достаточно, чтобы сообщить браузеру, достаточно ли свежа локальная кешированная копия, зачем вам Etag? Появление Etag в HTTP 1.1 в основном связано с решением нескольких проблем, которые трудно решить с помощью Last-Modified:

  • Некоторые файлы могут периодически изменяться, но их содержимое не меняется (только время модификации), в это время мы не хотим, чтобы клиент думал, что файл был изменен, и повторно ПОЛУЧАЛСЯ;

  • Некоторые файлы изменяются очень часто, например, если они изменяются в течение секунд (например, они изменяются N раз в течение 1 с), степень детализации, которую может проверить If-Modified-Since, находится на уровне s, и эту модификацию нельзя оценить. (или Говорят, что UNIX записи MTIME могут быть точными только до секунды);

  • Некоторые серверы не могут получить точное время последней модификации файла.

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

Last-Modifiedс EtagМожет использоваться вместе, сервер даст приоритет для проверки Etag , в случае непротиворечивости, продолжит сравнивать Last-Modified, и, наконец, решить, возвращать ли 304.

5. Влияние поведения пользователя на кеширование

Кража изображения в Интернете может в основном описывать влияние поведения пользователя на кеш.

6. Как перезагрузить кешированные ресурсы с сильным кешем

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

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

Подобно изображению ниже:

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

 

В частности, настоятельно рекомендуется увидеть ответ Чжан Юньлуна на этот вопрос и ответ Чжиху.Ууху. Call.com/question/20…