对强缓存和协商缓存的理解

缓存是指代理服务器或客户端磁盘内保存的资源副本。利用缓存可减少对服务器的访问,因此也就节省了通信流量和通信时间。
浏览器缓存是为了节约资源,并且可以加速浏览网站的速度,当用户第一次访问网页的时候,浏览器在用户磁盘上对请求的文档进行保存,当第二次访问的时候,就会从本地直接显示,从而提高了页面的访问速度。
浏览器缓存的优点:

  1. 减少了冗余的数据传输,节省了网费;
  2. 减少了服务器的负担,大大提升网站的性能;
  3. 加快客户端加载网页的速度;

浏览器缓存分为强缓存协商缓存

  • 浏览器进行资源请求时,会判断请求头是否命中强缓存,如果命中,直接从本地读取缓存,不会向服务器发送请求。
  • 当强缓存没有命中时,会发送请求到服务端,判断协商缓存是否命中,如果命中,服务器将请求返回,不会返回资源,告诉浏览器从本地读取缓存;如果不命中,则服务器直接返回资源。

区别:
强缓存命中,不会请求服务器,直接请求缓存;协商缓存命中,会请求服务器,不会返回内容,然后读取缓存。

from memory cache 和 from disk cache 的区别:

from memory cache:字面理解是从内存中,这个资源是直接从内存中拿到的,不会请求服务器,一般是已经加载过该资源且缓存在了内存中,当关闭该页面时,该资源就被内存释放掉了,再次重新打开相同页面是,不会出现 from memory cache 的情况。
from disk cache:这个资源是从磁盘当中取出的,也是在之前的某个时间加载过该资源,不会请求服务器,但是此资源不会随着该页面的关闭关闭而释放掉,因为此资源是存在硬盘中的,下次打开仍会from disk cache。

一、强缓存

强缓存,利用HTTP的返回头中的expires和cache-control两个字段来控制,用来表示资源的缓存时间(缓存的有效期)。
这种方法会有一个固定时间,但是如果服务器数据进行了更新,而强缓存的有效期还没有过期的话,则数据无法更新。

Expires

该字段是http1.0时的规范,它的值是GMT格式的绝对时间,浏览器进行第一次请求时,服务器会在返回头部加上Expires,下次请求,如果在这个时间之前就命中缓存。

Cache-Control

该值是利用max-age判断缓存的生命周期,是以秒为单位,如果在生命周期时间内,则命中缓存。

二、协商缓存

协商缓存,由服务器来确定缓存资源是否可用,所以客户端与服务端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。
利用 Last-Modified,If-Modified-Since 和 ETag,If-None-Match 来实现。

Last-Modified,If-Modified-Since

Last-Modified:表示为实体头部部分,response返回,表示资源的最后更新时间;
If-Modified-Since:通过比较两次的时间来判断资源在请求期间是否有修改,如果没有修改,则命中协商缓存,浏览器从缓存中读取资源,如果没有命中,资源有修改过,则返回新的Last-Modified时间和服务器资源。

ETag,If-None-Match

某些情况下仅判断最后修改日期来验证资源是否改动是不够的的:

  1. 存在周期性重写某些资源,但资源实际包含的内容并无变化;
  2. 被修改的信息并不重要,如注释等;
  3. Last-Modified 无法精确到毫秒,但有些资源更新频率有时会小于一秒。

ETag:为响应头部字段,表示资源内容的唯一标识,随服务器response返回;
If-None-Match:服务器比较请求头中的 If-None-Match 和当前资源中的 etag 是否一致,来判断资源是否修改过,如果没有修改,则命中缓存,浏览器从缓存中读取资源,如果修改过,服务器会返回新的etag,并返回资源。

浏览器第一次请求时:

在这里插入图片描述

浏览器在后续进行请求时:

在这里插入图片描述

强缓存和协商缓存的区别

缓存类型 获取资源形式 状态码 发送请求到服务器
强缓存 从缓存取 200(from cache) 否,直接从缓存获取
协商缓存 从缓存取 304(Not Modified) 是,通过服务器来告知缓存是否可用

猜你喜欢

转载自blog.csdn.net/weixin_45832482/article/details/125464978