Поверхностное понимание сильного кэша и согласованного кэша

внешний интерфейс JavaScript

Все кодовые книги используются в Express.

описание веб-кэша:

Веб-кэши — это HTTP-устройства, которые автоматически сохраняют копии обычных документов. Когда веб-запрос поступает в кеш, если локально есть «кэшированная» копия, документ может быть получен с локального устройства хранения, а не с исходного сервера. (Этот вывод взят из авторитетного руководства http)

Преимущества и недостатки кэширования:

преимущество:

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

недостаток:

  • Данные в кеше могут не соответствовать данным сервера;
  • потреблять память;
Обзор проверки кэша:
Кэш можно разделить на сильный кеш и кеш согласования.

1. Когда браузер делает запрос ресурса, он оценивает, попали ли заголовки ответа в сильный кеш, Если попадется, кеш будет прочитан непосредственно из локального, и запрос не будет отправлен на сервер.
2. Когда сильный кэш не ударяется, на сервер будет отправлен запрос, чтобы определить, ударит ли договорный кэш. Если он ударит, сервер вернет запрос без возврата ресурса, сообщив браузеру для чтения кэша локально. Как пропустить, сервер возвращает ресурс напрямую
Отличие: при сильном попадании в кеш сервер запрашиваться не будет, а кеш будет запрошен напрямую; если согласовано попадание в кеш, будет запрошен сервер, но содержимое не будет возвращено, и тогда кеш будет запрошен. читать;

Процесс обработки кэша

Разница между кешем памяти и кешем диска

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

из кеша диска: Аналогично предыдущему, этот ресурс берется с диска, и ресурс был загружен в определенное время до этого, и сервер не будет запрошен, но этот ресурс не будет освобожден при закрытии страницы, потому что Он хранится на жестком диске, и при следующем открытии он все равно будет из кеша диска (из:blog.CSDN.net/Гаррет Минимал/…)

Ниже приведены четыре способа реализации кэшей.

Сильный кеш

Сильный кеш делится на Expires и Cache-Control.

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


app.get('/', (req, res) => {
    const cssContent = path.join(__dirname, './html/index.html');
    fs.readFile(cssContent, function(err, data) {
          res.setHeader("Expires", new Date(Date.now() + 2592000000).toUTCString());
        res.end(data);
    })
});

Cache-Control, значение состоит в том, чтобы использовать max-age для определения жизненного цикла кеша в секундах, как попасть в кеш в течение времени жизненного цикла.

app.get('/', (req, res) => {
    const cssContent = path.join(__dirname, './html/index.html');
    fs.readFile(cssContent, function(err, data) {
        res.setHeader("Cache-Control", "max-age=0");
        res.end(data);
    })
});

кеш хитов:

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

Кэш консультаций с использованием Last-Modified, If-Modified-Since и ETag, If-None-Match для достижения
Last-Modified , If-Modified-Since

Last-Modified: он представлен как часть заголовка объекта, и возвращается ответ, который представлен как время последнего обновления ресурса.
If-Modified-Since: Судя по двойному сравнению времени, был ли изменен ресурс во время запроса, если нет, то попадание в кеш согласования, и браузер считывает ресурс из кеша. был изменен и возвращает время New Last-Modified и ресурсы сервера

    app.get('/', (req, res) => {
    const cssContent = path.join(__dirname, './html/index.html')
    fs.stat(cssContent, (err, start) => {
        if (req.headers['if-modified-since'] === start.mtime.toUTCString()) {
            res.writeHead(304, 'Not Modified');
            res.end();
        } else {
            fs.readFile(cssContent, function (err, data) {
                let lastModified = start.mtime.toUTCString();
                res.setHeader('Last-Modified', lastModified);
                res.writeHead(200, 'OK');
                res.end(data);
            })
        }
    })

});
ETag , If-None-Match

В некоторых случаях недостаточно проверить, изменился ли ресурс, просто определив дату последнего изменения:
1. Некоторые ресурсы периодически переписываются, но фактическое содержание ресурсов не меняется;
2. Измененная информация не важна, например, комментарии;
3. Last-Modified не может иметь точность до миллисекунд, но частота обновления некоторых ресурсов иногда меньше одной секунды.

ETag: соответствующее поле заголовка, представляющее уникальный идентификатор содержимого ресурса, возвращенного с ответом сервера;
If-None-Match: сервер сравнивает If-None-Match в заголовке запроса с тегом etag в текущем ресурсе, чтобы определить, был ли изменен ресурс. читает ресурс из кеша, если он был изменен, сервер вернет новый etag и вернет ресурс;

app.get('/home', (req, res) => {
    const cssContent = path.join(__dirname, './html/index.html')
    fs.stat(cssContent, (err, start) => {
        let etag = md5(cssContent);
        if (req.headers['if-none-match'] === etag) {
            res.writeHead(304, 'Not Modified');
            res.end();
        } else {
            fs.readFile(cssContent, function (err, data) {
                res.setHeader('Etag', etag);
                res.writeHead(200, 'OK');
                res.end(data);
            })
        }
    })
});

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

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

Дополнение: Согласно политике кеширования браузера, Expire и Cache-Control используют Enter, Back и F5 для обновления, чтобы пропустить локальный кеш, и каждый раз получать данные с сервера.