🐱HTTP的缓存控制🐱

Android_Banner.jpg

我们客户端向服务器请求资源是一件成本较高的事情,因为链路较长、网络不可控;

我们需要把这个获取到的数据缓存起来啊,下次请求时尽可能使用缓存的数据;

HTTP本身是基于【请求-应答】模式,基于这个模式,缓存可分为【服务器缓存】和【客户端缓存】;

服务器的缓存控制(Cache-Control)

当我们需要一个资源时,是这样的:

  1. 浏览器先去拿本地缓存数据,没有缓存数据就发送请求,向服务器获取资源;

  2. 服务器就响应请求,返回资源,同时标记资源的有效期;

  3. 浏览器获取到资源并缓存,等待下次请求时优先使用;

示意图
HTTP缓存-Server缓存控制-Cache-Control.png
max-age

服务器中使用Cache-Control头字段来标记资源的有效期,值【max-age=30】代表这个资源只能缓存30秒,之后就过期不能使用了;

其中这个max-age所代表的时间起点时响应报文创建的时间也就是离开服务器的时刻,而不是客户端收到报文的时间,这点与Cookie中的Max-Age是有点区别的;

当我们max-age=6,其中传输过程花费4S,那么这个资源的有效期就剩2S了;

除了max-age的缓存控制字段,在头字段中还有其他三位老哥来精确【指示浏览器如何使用缓存】

no_store 不允许缓存

用于某些变化非常频繁的数据

no_cache 可以缓存

使用之前必须要去服务器验证是否过期,是否有最新的版本;

must_revalidate

如果缓存不过期就可以使用,如果过期就必须去服务器验证;

整体服务器缓存控制的流程图
HTTP缓存-服务器缓存控制流程图.png

客户端的缓存控制

在整个【请求-应答】模式中,对于Cache-Control字段控制缓存策略,不仅服务器可以发,浏览器也是可以发的;

刷新按钮的点击

当点击刷新按钮时,会在请求头中加入【Cache-Control: max-age=0】;

max-age=0表明我要一个最新的数据,服务器收到后也会返回一个新的报文;

Ctrl+F5强制刷新

请求报文头字段中【If-Modified-Since】和【If-None-Match】会被清空返回最新数据;

浏览器中的缓存什么时候生效?

上述我们说的两种情况,都没有使用浏览器缓存,都是向服务器要最新的数据,那么什么时候使用自己的缓存呢?

结论

浏览器中的【前进】和【后退】

条件请求

当浏览器中使用【Cache-Control】做缓存控制都是向服务器请求最新数据刷数据,不能充分体现出缓存数据的作用;并且缓存数据还会失效,使用前还必须去服务器验证是否失效;

两个连续的请求组成的【验证动作】
  • 先发送一个HEAD请求,获取当前资源修改的时间等元信息,与缓存数据进行对比,没有变化就使用缓存,否则就发送请求获取最新的数据;

  • 两次请求的网络成本比较高,HTTP协议定义了一系列【If】开头的【条件请求】字段,专门用来验证资源是否过期,把上述两步做的事情合并成一步;

If开头的条件请求字段

条件请求中共有5个头字段

【If-Modified-Since】和【If-None-Match】是最常用的两个

我们需要在第一次的响应报文中预先携带【Last-modified】和【ETag】,然后第二次请求时需要带上缓存里的原值就可以;


HTTP缓存控制-IF条件控制.png

当缓存没有过期,服务器就返回一个【304 Not Modified】表示缓存依然有效,可以正常使用缓存;

Last-modified

表示资源最后修改的时间

ETag

实体标签(Entity Tag)的缩写,是资源的一个唯一标识;

主要用来解决修改时间无法准确区分文件变化的问题;

比如一个文件在1秒内修改了多次,因为修改时间是秒级的,这一秒内新版本无法区分;

比如一个文件会定期更新,但有时候会有同样的内容,但是时间在不断的变化,这是就会错误认为文件发生改变,就讲资源传输给浏览器,这样就浪费了带宽;

ETag的【强】【弱】之分

【强】ETag要求资源在字节级别上完全相同

【弱】ETag在值前有两个【W/】标记,仅仅要求资源在语义上没有变化,内部可能会有部分发生变化

比如HTML里的标签顺序的调整,或者多了几个空格;

上述我们的缓存Cache是缓存整个报文,不要错认为是body了哟!

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