强制缓存和协商缓存啥区别,咋用?

258 阅读3分钟

强制缓存和协商缓存在大四的时候网上看过资料,但现在回想起来模模糊糊,不知道啥区别,咋用,索性就重新理一下。

强制缓存和协商缓存最直观的区别就是:强制缓存不会向服务器发送请求,而协商缓存向服务器发送请求来判断是否命中缓存。

强制缓存不问服务器,直接从客户端缓存中读取资源,强!

协商缓存需要和服务器通信一下来判断是否使用缓存资源,协商。

两个缓存在命中后的状态码上也有区别,强制缓存是200,协商缓存是304

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

怎么用?请求头里面需要用哪些参数?

强制缓存

需要设置Cache-Control字段中的max-age参数,max-age的值表示的资源有效时间,比如max-age=300就是5分钟内有效。

Cache-Control还有四个常用的参数:

  1. public:表示资源可以被终端用户和CDN等中间代理服务器缓存
  2. private:资源不能被中间代理服务器缓存,只能终端用户缓存
  3. no-cache:跳过强制缓存,使用协商缓存。一般情况下是强制缓存不命中才会调用协商缓存。
  4. no-store:直接不用缓存。

协商缓存

协商缓存不用手动设置过期时间,单有几个用于判断缓存是否过期的参数。

Last-Modify:第一次请求资源的时候服务器返回的header里面会有加上这个参数,Last-Modify是该资源的最后修改时间。

If-Modify-Since:客户端再次请求时会带上If-Modify-Since,它的值就是服务器返回的Last-Modify的值。服务器收到后会对比最后修改时间来判断缓存是否命中。

Etag:资源在服务器的唯一标识,也是用来判断资源是否变化的。至于已经有Last-Modify为什么还要用Etag,是因为Last-Modify只能精确到秒,一秒内多次修改就需要用Etag来精确判断

Etag比Last-Modify更加精确,Last-Modify性能比Etag好。在判断优先级上Etag优先。

除了判断缓存是否命中的参数,还有一个设置强制缓存不命中时是否取协商缓存的参数If-None-Match

**If-None-Match:**当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定是否命中协商缓存。

协商缓存的过程示意图:

在这里插入图片描述