前端缓存(进击)

前言

    缓存一直是一个前端的痛点,相信很多前端在面试的时候,大多是都遇到过缓存问题。接下来我们一起来学习


优点

相信大家都知道缓存的好处,那这里还是再简单的唠叨一下~~
缓存是用来提高性能的一项必不可少的技术 ,利用这项技术可以很好地提高web的性能:
1.打开本地资源速度当然比请求回来再打开要快得多。
2.缓存可以很有效地降低网络的时延,同时也会减少大量请求对于服务器的压力。
3.缓存可以减少带宽消耗。


一个小的概念

    首先我们要知道——缓存实际上就是——请求资源的拷贝。

    思考一个小问题——如果每次请求都将资源保存下来,那岂不是很傻逼的做法吗?内存被大量的消耗,开发者不易维护,没有固定的协议告诉我,这个缓存什么时候过期,什么时候需要请求新的资源,之前的缓存的资源在本次请求中是否还有用,自然的,客户端也会崩溃。

    如何解决——那就是利用HTTP协议,HTTP协议是我们每次请求必经之路,那么通过HTTP协议来确定上面的这些问题在合适不过了。


缓存分类

第一种分类:
1. 共享缓存:各级代理缓存的资源。
2. 私有缓存:用户专有的资源。

第二种分类(后端---->前端):
1. 数据库缓存:
    对于系统一些非常复杂的查询,可以将查询到的结果保存在内存中,下次就不需要查询数据库,导致数据库鸭梨三大,而是直接从内存中读取即可。
2. 网关缓存:
    也被称为“反向代理缓存”或“替代缓存”。网关缓存起中介作用,多半是网站管理员(公司专门的运维工程师、或UED或程序组某人Add)部署,这样更容易扩展与维护。可以有多种方法把请求路由到网关缓存,但通常使用某种形式的负载均衡器,使它们看起来像源服务器。[此处不深入展开]
3. 代理服务器缓存:
    也被称为“正向代理缓存”,代理服务器缓存原理为成千上万的用户提供缓存机制。每一次请求先发送到代理服务器上,代理服务器存在请求的数据,则返回给客户端,不存在就转发到源服务器并取得响应结果后,再返回给客户端。同一个缓存可能会被重用多次,减少响应时间和带宽以及源服务器的鸭梨。
4. 浏览器缓存:
    相信你开发某个网站时,肯定使用过“清空缓存”来解决问题,这就是在清除缓存在本地磁盘上的资源数据。在本地缓存是非常有用的,访问本地与发送请求接受请求,快了不知多少倍呢。

    对于上面几种缓存,前端遇到最多的就是浏览器缓存了吧,接下来我们一起来深入理解浏览器缓存吧~


浏览器缓存

对于一个完整的HTTP GET请求缓存过程会包含几个主要的步骤:
①客户端读取请求报文并且对报文进行解析, 提取URL和各种首部。
②查询是否在本地有请求资源副本,如果本地没有资源副本就会从服务器上获取资源,并且保存在本地。
或者:接着会进行查看资源副本是否足够新鲜(新鲜度检测), 如果缓存已经失效就会询问服务器是否有任何更新。
③服务器用新的首部和已缓存的主体来构建一条响应报文。
④服务器将响应报文发送给客户端。
⑤客户端读取响应报文进行相应的操作。

先来看一张浏览器缓存过程的的图片,可以不看具体内容,接下来我们会根据本图详细讲解浏览器缓存~


缓存流程图

划重点:根据缓存处理方式的不同,接着浏览器缓存又分为又会分为:强缓存阶段、协商缓存阶段 、启发式缓存阶段。一起来看看吧~~


强缓存

    在阅读下面知识点,请自行解决请求头和报文头,三次握手等相关的网络知识点。好了,接下来我们正式开始理解~~

    强缓存主要是响应头中的Cache-ControlExpires两个字段进行控制的。
    Expires:HTTP/1.0中定义,指定了一个绝对的过期时期,但设计之初存在着缺陷:如果本地时间和服务器时间相差太大,就会导致缓存错乱。
    Cache-Control:HTTP 1.1中定义,Cache-Control:max-age定义了一个最大使用期,就是从第一次生成文档到缓存不再生效的合法生存时间。
    同时使用:当然是HTTP协议高的优先级高,不然要再来一个缓存字段干嘛?所以 Cache-Control > Expires。

    一个场景:当浏览器再次访问之前访问过的CSS文件时,发现本地这个文件的缓存,就根据上一次的响应头判断是否过期,没过期,使用缓存加载文件。但是过期了呢???请接着看~~

    过期之后,ETag 和 Last-Modified 就开始参与强缓存的判断了。
    Last-Modified:文件最后一次修改的时间。
    ETag:对文件的一个标记。可能是抗碰撞散列函数、最近修改时间戳的哈希值、甚至只是一个版本号等等。


协商缓存

    强缓存机制如果检测到缓存失效,就需要进行服务器再验证,这种缓存机制也称作协商缓存。
    1. 当浏览器再次试图访问CSS文件,发现缓存过期,如果上一次的响应头中有ETag 和 Last-Modified,就会在本次请求的请求头里携带If-Moified-Since和If-None-Match这两个字段,进入步骤2。如果上一次的响应头中没有ETag 和 Last-Modified,就直接像服务器发送请求,进入步骤4。
    2. 服务器通过If-Moified-Since和If-None-Match这两个字段来判断资源是否有修改,如果有修改则返回状态码200和新的内容,如果没有修改返回状态码304。
    3. 浏览器收到200状态码,相当于首次访问这个文件,该怎么处理就怎么处理。浏览器收到304状态码,知道本地缓存虽然过期但仍然可以用,加载本地缓存。
    4. 根据新返回的响应头来设置缓存。


启发式缓存

    浏览器用来确定缓存过期时间的字段一个都没有时,那该怎么办?浏览器进入启发式缓存阶段。
    根据响应头中2个时间字段 Date 和 Last-Modified 之间的时间差值,取其值的10%作为缓存时间周期。
    这个阶段很容让人忽视,但实际上每时每刻都在发挥着作用。所以在今后开发过程中如果遇到默认缓存的坑,要知道浏览器只是在遵循启发式缓存协议而已。


附加知识点

    关于缓存是从磁盘中获取还是从内存中获取,Chrome会根据本地内存的使用率来决定缓存存放在哪,如果内存使用率很高,放在磁盘里面,内存的使用率很高会暂时放在内存里面。这就可以比较合理的解释了为什么同一个资源有时是from memory cache有时是from disk cache的问题了。

memory or disk cache

完结

再去看看上边的图吧,很好的解释了浏览器缓存过程~~

参考文章:前端性能优化之缓存之路缓存详解

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