HTTP缓存策略

定义

HTTP缓存策略

实例

一 、协商缓存

Last-Modified\ Etag 与 If-Modified-Since/If-None-Match 定义
响应头 请求头
Etag If-None-Match
Last-Modified If-Modified-Since
  • ETag(实体标签): 用于标识Web服务器上资源的版本。每个资源被请求时,服务器会生成一个对应的ETag,客户端可以保存这个ETag值。当客户端再次请求该资源时,可以将上次获取的ETag值通过If-None-Match头部信息发送给服务器,服务器会比较客户端发送的ETag和当前资源的ETag是否一致,如果一致则返回304 Not Modified,而不返回资源内容,从而实现了缓存控制和减少数据传输量。 ETag通常是根据资源内容生成的哈希值或者版本号等唯一标识符。
  • Last-Modified:用于指示服务器上资源的最后修改时间。当客户端请求一个资源时,服务器会返回该资源的Last-Modified时间。客户端可以保存这个时间戳,下次请求时可以通过If-Modified-Since头部信息将这个时间戳发送给服务器,服务器会判断资源是否在此时间之后被修改过,如果没有修改过,返回304 Not Modified,允许客户端使用本地缓存的资源。 Last-Modified和If-Modified-Since这种方式可以减少对服务器资源的不必要请求,提高性能。
  • If-modified-since: 用于指示服务器只返回在指定日期之后修改过的资源。当客户端发送一个请求时,可以包含If-modified-since头,服务器会检查资源是否在指定日期之后被修改过,如果没有被修改,则返回一个304 Not Modified响应,告诉客户端可以使用本地缓存的副本。这样可以减少带宽占用,提高效率。
  • If-none-match: 用于指示服务器只返回与指定的ETag(实体标签)值不匹配的资源。ETag是服务器为每个资源分配的唯一标识符。当客户端发送一个请求时,可以包含If-none-match头,服务器会比较请求中的ETag和当前资源的ETag是否相同,如果不相同,则返回完整的资源;如果相同,则返回一个304 Not Modified响应,告诉客户端可以使用本地缓存的副本。这样可以减少带宽占用,提高效率。
实例
  • 第一次请求png文件时,可以在响应标头中看到服务端设置的Etag和Last-Modified。


    image.png
  • 第二次请求png文件时,如下面两幅图
    首先可以从状态码上看到区别;第一次请求响应的状态码是200,第二次是304。其次查看第二次请求的请求头,可以看到If-Modified-Since(值为第一次响应头中Last-modified的值)和If-None-Match(值为第一次请求的响应头中Etag的值)两个字段


    状态码.png
请求头.png

二、强缓存

1. Cache-control(http1.1)
  • no cache
    可以在客户端存储资源,每次都必须去服务端做新鲜度校验,来决定从服务端获取新的资源(200)还是使用客户端缓存(304)。也就是所谓的协商缓存,即表明跳过强缓存,进入协商缓存
    ① 请求头中设置Cache-Control: no-cache

当我们勾选了“停用缓存”刷新页面,再查看png请求,可以看到请求头中多了个Cache-Control:no-cache表示不使用缓存

禁用缓存.png

在请求头中设置Cache-Control: no-cache的效果和在请求的响应头中设置Cache-Control: no-store 效果一样,客户端都不会缓存资源,每次都要去服务端获取资源
② 响应头中设置Cache-Control: no-cache

  • no store
    禁止在客户端存储资源,每次请求都需要去服务器获取资源


    no store.png

    第二次请求.png

    状态码.png

当设置了 cache-control:no-store 时,禁止本地缓存,且当cache-control: no-store 与Etag同时存在时,强缓存的优先级高与后者

  • max-age
    ① lighttpd服务
    设置了max-age=60 即,在60s内如果再次访问,使用缓存,如果超过60 则会像服务器发起请求。
    • 第一次请求


      max-age.png
  • 60s内第二次请求????

??? 这里按照规则应该直接读取内存缓存,状态码200,但是不知道为啥我测试的是这个情况

读取缓存内容.png
  • 超过60s 之后的第三次请求和第二次一样

cache-control 这里的使用存疑,不知道是否lighttpd配置的缘故,自己另外用Express搭建了一个如下

② Express

第一次访问.png
60s之内的第二次访问.png
60s之后的第三次.png
三次访问流程.png

附:express配置代码

app.use(expressStaticGzip(path.join(__dirname, 'public'), {
        cacheControl: true,
        setHeaders: function(res, path) {
            res.header("Cache-Control", "max-age=60")
        }
    }))
2. Pragma(http1.0)
image.png

总结

  • 优先级

    1. Cache-Control > Expire > Etag > Last-modified
    2. 强缓存 > 协商缓存
    3. Cache-Control > Expires / Pragma


      缓存策略.png
  • 区别和联系
    共同点:如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;

    区别:强缓存不发请求到服务器,协商缓存会发请求到服务器。

参考

图解Http缓存控制之max-age=0、no-cache、no-store区别
no-cache 和 no-store 的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354