前端缓存

前端缓存

前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而浏览器缓存则主要由前端开发在前端js上进行设置。

缓存可以说是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。

对于一个数据请求来说,可以分为发起网络请求、后端处理、浏览器响应三个步骤。浏览器缓存可以帮助我们在第一和第三步骤中优化性能。比如说直接使用缓存而不发起请求,或者发起了请求但后端存储的数据和前端一致,那么就没有必要再将数据回传回来,这样就减少了响应数据。

缓存过程

浏览器与服务器通信的方式为应答模式,即是:浏览器发起HTTP请求 – 服务器响应该请求。那么浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中。

  • 浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识
  • 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中

缓存作用

  • 减少了冗余的数据传输,节省了网费。
  • 减少了服务器的负担, 大大提高了网站的性能
  • 加快了客户端加载网页的速度

缓存分类

  • 强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务端发生交互
  • 两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则

强制缓存

在缓存数据未失效的情况下,可以直接使用缓存数据,那么浏览器是如何判断缓存数据是否失效呢? 在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。

image.png

对比缓存

  • 对比缓存需要进行比较判断是否可以使用缓存。
  • 浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。
  • 再次请求数据时,客户端将备份的缓存表示发送给服务器,服务器根据缓存标识进行判断,判断成功后返回304状态码。通知客户端比较成功,可以使用缓存数据。
image.png

请求流程

第一次请求

浏览器开始请求 -> 无缓存 -> 向web服务器请求 -> 请求响应,缓存协商 -> 呈现

是否缓存Expries,Cache-Control
缓存时间
Etag
Last-Modifyed

第二次请求

image.png

通过最后修改时间来判断缓存是否可用

  1. Last-Modified: 响应时告诉客户端对比此资源的<b>最后修改时间</b>.
  2. If-Modified-Since: 当资源过期时使用Cache-Control表示的max-age,发现资源具有Last-Modified声明,则再次向服务器请求时带上IF-Modified-Since。
  3. 服务器收到请求后发现带有If-Modified-Since标识则与被请求资源的最后修改时间进行对比,若最后修改时间较新,说明资源又被改动过,则响应<b>最新的资源</b>并返回<b>200状态码</b>。
  4. 若最后修改时间和If-Modified-Since一样,说明资源没有被修改,则响应<b>304标识未更新</b>,告诉浏览器继续使用所保存的缓存文件。

最后修改时间存在的问题

  • 某些服务器不能精确到的文件的最后修改时间,这样就无法通过最后修改时间来判断文件是否更新了。
  • 某些文件的修改非常频繁,在秒以下的时间内进行修改,Last-Modified只能精确到秒。
  • 一些文件的最后修改时间改变了,但是内容并未改变,我们不希望客户端认为这个文件修改。
  • 如果同样的一个文件位于多个CDN服务器上的内容虽然一样,修改时间不一样。

Etag

Etag是实体标签的缩写,根据是实体内容生成的一段hash字符串,可以表示资源的状态。当资源发生改变时,Etag也随之发生变化。Etag是web服务端产生的,然后发给浏览器客户端。

  • 当客户端先判断缓存是否可以使用之前获取的缓存中文档中的ETag时,然后通过If-None-Match发送请求给Web服务器询问次缓存是否可用。
  • 服务器收到请求,将服务器中的此文件的Etag,跟请求头中的If-None-Match相比较,如果值是一样的,说明缓存还是最新的,web服务器将发送304 Not Modified响应码给客户端表示缓存未修改,可用使用缓存。
  • 如果不一样则web服务器将发送该文件的最新版本给浏览器客户端。

如何干脆不发送请求

  • 浏览器会将文件缓存到Cache目录中,第二次请求时浏览器会先检查Cache目录下是否有该文件,如果有,并且还没有到Expires设置的时间,即文件未过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求.
  • Expires是服务器响应的消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存中读取数据,而无需再次请求,这是HTTP1.0的内容,现在浏览器均默认使用HTTP1.1
  • Cache-Control与Expires的作用一致,都是指当前资源的有效期,控制浏览器是否直接从浏览器缓存读取数据还是重新发送请求到服务器读取数据,如果未设置的话,其优先级高于Expires。

Cache-Control

  • private 客户端可以缓存
  • public:客户端和代理服务器都可以缓存
  • max-age=60 缓存内容将在60秒后失效
  • no-cache 需要使用对比缓存验证数据,强制向服务器再次验证
  • no-store 所有内容都不会缓存,强制缓存和对比缓存都不会触发

浏览器缓存

本地存储小容量

  • Cookie:主要用于用户信息的存储,Cookie的内容可以自动在请求的时候被传递给服务器。
  • LocalStorage: 数据将一直保存在浏览器内,直到用户清除浏览器缓存数据为止。
  • SessionStorage: SessionStorage的其他属性同LocalStorage,只不过它的生命周期同标签页的生命周期,当标签页被关闭时,SessionStorage也会被清除。
容量 作用
Cookie 4KB 请求时传递
localStorage 5MB 永久存储
SessionStorage 5MB 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。

本地储存大容量

WebSql和IndexDB主要用在前端有大容量存储需求的页面上,例如,在线编辑浏览器或者网页邮箱。

说明 状态
WebSql 关系型数据库 废弃
IndexDB 非关系数据库 正常使用

往返缓存

往返缓存又称为BFCache,是浏览器在前进后退按钮上为了提升历史页面的渲染速度的一种策略。该策略具体表现为,当用户前往新页面时,将当前页面的浏览器DOM状态保存到bfcache中;当用户点击后退按钮的时候,将页面直接从bfcache中加载,节省了网络请求的时间。

参考链接

前端缓存详解

欢迎访问主页,有更多文章内容
转载请注明原出处
原文链接地址:前端缓存

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

推荐阅读更多精彩内容

  • 浏览器端的缓存规则 对于浏览器端的缓存来讲,这些规则是HTTP协议头和HTML页面的Meta标签中定义的。他们分别...
    niklause_sun阅读 4,982评论 0 7
  • 前言 在前端面试中,可能或多或少都会被提及缓存问题,而这个问题大多数都是作为业务中不得不考虑的一个性能优化点,如果...
    曾經丶記憶的風景阅读 402评论 0 1
  • 一、概述 良好的缓存策略可以降低资源的重复加载提高网页的整体加载速度通常浏览器缓存策略分为两种:强缓存和协商缓存 ...
    调皮的绅士阅读 3,418评论 0 12
  • 数据请求可分为三个步骤, (1)发起网络请求——>(2)后端处理——>(3)服务器响应,前端缓存可在第一个和第三个...
    贝贝1022阅读 1,447评论 0 1
  • 一、前言 前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务...
    Thomas赵骐阅读 42,822评论 5 65