前端缓存机制之http篇

       大家好哇,这几天家里搞装修,一到周末就回家跑工地,吃苦受罪还花钱。好在我还有不得不学习的理由,是穷,是穷让我成为了一只勤奋的猿(/奋斗脸)。

       这两天重点补充了一下前端的缓存机制。缓存是个好东西啊,可以减少网络IO消耗,提高访问速度,对前端性能优化有着显著的效果。

       依在下愚见,前端的存储分为两个方向,本地缓存以及浏览器缓存。今天主要介绍一下浏览器缓存的原理。

浏览器缓存是依赖于http协议的,所以一下就成之谓HTTP缓存

HTTP缓存也可以分为两种,强缓存协商缓存,优先级较高的是强缓存,在命中强缓存失败的情况下,才会走协商缓存

强缓存的实现原理:

        强缓存是利用http头中的Expires和Cache-Control两个字段来控制的。当请求“再次”发起,浏览器来检测expire和cache-control来判断目标资源是否符合强缓存,若符合则直接从缓存中获取资源,不会再与服务端发生通信。

来看一张配图吧,我们把目光关注到Expires和Cache-Control上,这两位爷台想表达什么意思呢?

        我看过的资料中把Expires翻译成一个时间戳,其实在下看来,从字面意思理解,它就是个过期时间嘛,就像是我们超市里买的营养快线一样,都有保质期的嘛汪。所以当浏览器再次,一定是再次向服务器请求资源的时候,浏览器就会先对比本地时间和expires的保质期,如果本地时间小于expires的保质期,那么就直接去缓存中取这个资源喵。

       “那要是我把本地时间改了的话,是不是就无法达到预期的效果啦?”

       “不错!问得好,紫薇”

        在考虑到expires这个过期时间的方案不靠谱之后,HTTP1.1新增了Cache-Control来接expires的班儿。Cache-Control可以视作是expires的完全替代方案,那么它是怎么给expires干掉的呢,灯光师,来个特写来。

        各位官爷请看,在Cache-Control中,我们通过max-age来控制资源的有效期。这次我们用的不是一个时间点,而是一个时间长度,31536000代表31536000秒,在31536000秒之内不管访问几次,都是走我浏览器缓存,如果cache-control和expires同时存在,那么优先考虑cache-control。耶!

        关于Cache-Control的另一个参数public,是在告诉浏览器是否可以被代理服务器缓存,如果我们只想浏览器缓存,默认设置private便可,Cache-Control还有一个为代理浏览器服务的参数叫做s-maxage,如果两者同时出现且s-maxage未过期,则向代理服务器请求其缓存内容。在大型项目中,架构会依赖各种代理服务器,所以我们不得不去考虑代理服务器的缓存问题(这一块儿只是在下还未参透,就不在各位看官面前妄言了)。


协商缓存的实现原理:

        前文书说到,强缓存会比协商缓存的优先级要高,这是因为协商缓存也会向服务器发送http请求的!

        协商缓存是依赖Last-Modified和Etag,他们会埋伏在响应头中,来告诉浏览器这个服务器中的资源有没有修改过呀,如果有的话从服务器中拉取最新资源,如果没有的话继续使用浏览器中缓存汪。

        Last-Modified也是个时间戳,它会在我们首次请求的时候随着Response Headers返回,告诉浏览器我们最后一次修改时间是18年六月,随后我们每次请求都会带上一个叫If-Modified-Since的时间戳字段,它的值正是上一次请求时Last-Modified的值。

        此时服务器接收到了这个时间戳,会比对该时间戳和服务器上资源的最后修改时间是否一致,如果一致则返回304状态码告诉浏览器就用缓存就好啦~

        但是!!!

        1,如果我们编辑了文件,但是并没有对文件内容做修改,Last-Modified时间戳也会变,不该重新请求的时候也去重新请求了。

        2,当我们修改文件的手速巨快,由于If-Modified-Since只能检查到以秒为最小计量单位的时间差,所以它是感知不到这个改动的,该重新请求的时候也不会重新请求了。

        所以,etag作为Last-Modified的补充就出现了。

        Etag和Last-Modified类似,当我们首次请求时,会在响应头里获取到一个最初的标识字符串,这个是服务器算出的hash值,比last-modified更准确:

        等到用户下一次请求的时候,请求头里会带上一个名为If-None-Match的值给服务器来比对,是的,这个值就是etag中取出来的

        服务器在比对了这串hash值之后就可以知道文件有没有修改过,从而是返回304还是获取最新资源了。

        但是etag的hash值在生成过程中也是需要服务器额外付出开销的,这也是他的弊端喵。


        到此为止http的缓存已经全部讲完了,在下再为各位模拟一下协商缓存中浏览器与服务器的对话哦。

强缓存:

        场景:我访问了一下自己的网站,刷出了自己的帅照~

        浏览器:“老服,我要一张 Yabble最帅.jpg 图片,我展示用”

        服务器:“知道了,给你这个 Yabble最帅.jpg 你先用着,这货也不爱打扮,3个月之内用它都可以(cache-control: 大概3个月的秒数)。”

        场景:我立刻又访问了一次~

        浏览器:“老服,这糙货又访问了,快给我图片...诶,还没过期呀,那直接用旧的就得了呗”

协商缓存:

        场景:我访问了一下自己的网站,刷出了自己的帅照~

        浏览器:“老服,我要一张 Yabble最帅.jpg 图片,我展示”(嘿嘿,原谅我偷懒了)

        服务器:“知道了,给你这个 Yabble最帅.jpg 你先用着,这货最近还敷上面膜了,不知道哪儿天就变小鲜肉了,给你个暗号(etag)记着点,等他哪天捯饬的不一样了我告诉你~”

        场景:我又访问了一次

        浏览器:“老服,他又访问了,快给我这糙货的图片,这是暗号(If-none-match)”

        服务器:“来,暗号给我看看,没变样嘛,还用那张旧的吧”

        场景:我面膜美颜加刮胡子之后上传替换了一张自拍照,访问网站ing~

        浏览器:“老服,他又访问了,快快,这是暗号(If-none-match)”     

        服务器:“哦哦,暗号给我来看,哟呵,和现在的照片不一样了嘿,给你新的。刷刷刷~”


        哈哈,看到这里的看官,到此为止这篇文章已经接近尾声了,原谅在下文笔拙掠,技术有限,与其说分享还是当成自己的学习笔记更贴切,现在已经到了Q4,工作压力不是一般的大,各位同行老铁注意休息,周末多出门运动,健康是多少钱都买不回来的。

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

推荐阅读更多精彩内容