Первое знакомство с Http Cache Jun

Node.js внешний интерфейс JavaScript браузер

предисловие

13 ноября 2017 года, в n-й день, когда я начал свое путешествие по интерфейсу, я бродил в одиночестве возле своей спальни, встретил Ченг Джуна и пришел спросить меня: «Вы когда-нибудь писали немного о http-кэшировании? Что нет? Я сказал «нет», он предупредил меня, «ты еще немного напишешь, http cache должен быть очень рад познакомиться с тобой, ты сможешь узнать друг друга еще немного».

Но мне действительно нечего сказать. Я просто чувствую, что место, где я живу, нечеловеческое. Менеджеры по продукту недобры и используют программистов как крепких псов. Но настоящие программисты осмеливаются столкнуться с унылой зарплатой и с текущими ошибками. Что это за скорбящие и счастливые люди? Однако реконструкция часто рассчитана на посредственностей, использующих течение времени, чтобы смыть старые следы, оставив только бурные сверхурочные часы и безразличную грусть. В этом бурном овертайме и равнодушной печали людям приходится жить временно, поддерживая этот бесчеловечный мир. Я не знаю, когда этому миру придет конец!

А я все еще жил в таком мире, поэтому почувствовал необходимость что-то написать.

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

1. Встреча

Встреча с мистером Кэшем произошла снежной ночью. Когда я увидел ее, я знал, что у нас будет история. Я был слишком застенчив, чтобы идти вперед, чтобы общаться с ней. Марк Бу - мой хороший друг, изначально им не был, с тех пор, как я увидел его в арбузном поле под луной с неописуемым, мы стали хорошими друзьями. Он сказал мне: "Не бойся, я создам для тебя обстановку, и ты сможешь сосредоточиться на своих делах. Но перед этим я немного расскажу тебе о Кэче-куне". очень счастлив.

  • 200 : Нормальное общение.Каждый раз, когда вы что-то говорите, вы прокручиваете это в уме и находите подходящий вежливый ответ, чтобы ответить вам.
  • 304: Она знает, чего вы хотите, но ей нужен мозг, чтобы дать своему телу команду, а затем предпринять соответствующие действия, чтобы дать вам то, что вы хотите. (согласование кеша)
  • из кеша памяти или кеша диска: Хоум-раны предполагают, что инстинктивная реакция тела также является самой быстрой. (сильный кеш)

2. Общение

const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer().listen(3000);

server.on('request',(req,res) => {
    const url = path.join(__dirname,'static',req.url);
    fs.readFile(url,(err,data) => {
        //马克步对我说,你别管其他的,每次有静态请求
        //就会执行这里的代码,读取文件然后返回出去。
        //之后会在这里设置响应头
        res.end(data);
    })    
});

Однако во время обмена это меня не радовало, она всегда относилась ко мне прохладно.


Сколько бы раз я с ней ни говорил, она всегда долго думает, прежде чем ответить мне, что меня очень огорчает. Тогда Марк Бу сказал мне: «Не расстраивайся, я установлю для тебя пароль, и каждый раз, когда ты будешь использовать этот пароль для общения с ней, это сделает твое общение более приятным. Есть два вида паролей. ."

//第一种 以资源内容hash为版本号
server.on('request',(req,res) => {
    const url = path.join(__dirname,'static',req.url);
    fs.readFile(url,(err,data) => {
        //如果之前的请求在响应头里返回了Etag 那么这次请求就可以拿到
        //req.headers['if-none-match'] == 之前响应头里的Etag
        if(req.headers['if-none-match'] == 'hello'){
            res.statusCode = 304;
            res.end();
        }else{
        //响应头里设置Etag,下次请求的时候,会在请求头里加上If-None-Match
            res.setHeader('Etag', 'hello');
            res.end(data);
        }
        res.end(data);
    })    
});

Я снова поболтал с Кэшем Джуном.

这一次依然如同陌生人一样,但是这次我拿到了一个暗号,`Etag:hello`,我激动地赶紧使用暗号重复刚才的话。
На этот раз он был все еще как незнакомец, но на этот раз я получил пароль «Этаг: привет», и я использовал пароль, чтобы повторить то, что я только что взволнованно сказал.

呀,缓存君对我态度果然变了呀,而且速度也快了很多。
Да, кэш король моего отношения действительно изменил его, но скорость также намного быстрее.

//第二种 以资源修改时间为版本号
server.on('request',(req,res) => {
    const url = path.join(__dirname,'static',req.url);
    fs.readFile(url,(err,data) => {
        //如果之前的请求在响应头里返回了Last-Modifiedtag 那么这次请求就可以拿到
        //req.headers['if-modified-since'] == 之前响应头里的Last-Modified
        if(req.headers['if-modified-since']){
            res.statusCode = 304
            res.end()
        }else{    
            //在响应头里设置上次修改时间 必需为国际标准时间
            res.setHeader('Last-Modified', new Date().toUTCString());
            res.end(data);
        }
        res.end(data);
    })    
});

第二天再次攀谈,缓存君不认识我了。不过没关系,我拿到了时间暗号
На следующий день мы снова поговорили, и мистер Кэш меня больше не знал. Но это не имеет значения, я получил тайм-код

我们像老朋友一样愉快的交流了起来
Мы весело болтали, как старые друзья

Мадам, я думаю. . .

Марк Бу лучше всех знает мои мысли, он сказал мне, что если вы хотите очень интимных отношений, вы можете установить время расставания.

server.on('request',(req,res) => {
    const url = path.join(__dirname,'static',req.url);
    fs.readFile(url,(err,data) => {
        //设置缓存过期时间
        res.setHeader('Cache-Control','max-age=5');
        res.end(data);
    })    
});

Я медленно двинулся вперед с беспокойным сердцем.

第一次交谈没什么变化,但是她给了我一个时间
Первый разговор мало что изменил, но она дала мне время

卧槽!瞬间就亲密无间了。
FML! Мгновенно близость.

但是五秒后,又不认识我了(max-age以秒记)
Но через пять секунд я снова не узнаю себя (максимальный возраст в секундах)

Марк Бу подумал про себя: «Думаю, пяти секунд тебе должно хватить!»

Этот опыт

HTTP-кэш делится на:

  • Сильный кеш --- в течение срока действия получать ресурсы напрямую с локального,Нет необходимости отправлять запрос.
  • Weak Cache --- То же, что и выше, в течение срока действия. вне срока действиянужно отправить запрос, если он вернет 304, то продолжит использовать локальный кеш, если вернет 200, новая версия будет закэширована, а локальная версия будет выброшена.

Этот опыт действительно не питательный. Для более подробной информации, вот несколько предложений:

  1. Как разработать и внедрить интерфейсный код в крупной компании?
  2. Использование кэширования HTTP: Etag, Last-Modified и Cache-Control
  3. Анализ механизма кэширования браузера
  4. HTTP-кеш MDN

Лучше всего читать 1, 2, 3 по порядку и дополнять документацию MDN в процессе чтения.


На самом деле, Макбу не его настоящее имя. Однажды я спросил о его настоящем имени, и Макбу сказал: «Мое имя действительно грязное, потому что гадалка сказала, что мне не хватает земли, поэтому он сбалансировал имя для меня». Я думаю, подумав об истории Марка Бу и Си, он был удивлен: «Не говорите мне, что вас зовут», Марк Бу сказал: «У вас есть хорошая идея, меня зовутбудуар"