Skip to content

强缓存、协商缓存

发表于: at 05:13

一、强缓存

强缓存就是本地缓存

浏览器首次请求资源后,需要再次请求时,浏览器会首先获取该资源缓存的 header 信息,然后根据 Cache-Control 和 expires 来判断该资源在本地缓存否过期。若没过期则直接从本地缓存中获取资源信息,浏览器就不再向服务器重新请求资源,如过期则需重新发送请求,重新缓存资源,更新缓存时间。

强缓存是利用 http 请求头中的 Expires 和 Cache-Control 两个字段来进行控制,用来表示资源的缓存时间。

  1. Expires

Expires 是 http1.0 的规范,它的值是一个 GMT 格式的绝对时间字符串。

expires: Thu, 17 Nov 2022 10:06:35 GMT
  1. Cache-Control
cache-control: max-age=31536000

Cache-Control 是 http1.1 中出现的,它的值是一个相对时间。Cache-Control 拥有多个值:

Expires 和 Cache-Control 的区别?

首先一个是绝对时间一个是相对时间。绝对时间跟系统时间改变而改变,这说明可以人为的改变该时间。而相对时间则是固定时间,是从请求到资源的那一刻开始算起。 两个时间可以共存,Cache-Control 优先级更高

二、协商缓存

协商缓存是服务器用来确定缓存资源是否可用过期

因为服务器需要向浏览器确认缓存资源是否可用,二者要进行通信,而通信的过程就是发送请求,所以在 header 中就需要有专门的标识来让服务器确认请求资源是否可以缓存访问,所以就有了下面两组 header 字段:

  1. (http1.0) Last-Modified 和 If-Modified-Since
  1. (http1.1) Etag 和 If-None-Match

Etag 表示文件在服务器的唯一标识(生成规则由服务器决定),在 iis 中由 FileTimeStamp(时间戳)和 ChangeNumber(修改编号),其中 FileTimeStamp 是类似 MD5 算法方式计算出来的,微软没有公布算法。

既然都是一样的处理逻辑,那这两个有什么不同吗?

说白了 Etag/If-None-Match 就是用来弥补 Last-Modify/If-Modify-Since 的不足