强制缓存和协商缓存在大四的时候网上看过资料,但现在回想起来模模糊糊,不知道啥区别,咋用,索性就重新理一下。
强制缓存和协商缓存最直观的区别就是:强制缓存不会向服务器发送请求,而协商缓存会向服务器发送请求来判断是否命中缓存。
强制缓存不问服务器,直接从客户端缓存中读取资源,强!
协商缓存需要和服务器通信一下来判断是否使用缓存资源,协商。
两个缓存在命中后的状态码上也有区别,强制缓存是200,协商缓存是304
| 缓存 | 获取资源形式 | 状态码 | 发送请求到服务器 |
|---|---|---|---|
| 强制缓存 | 从缓存取 | 200(from cache) | 否,直接从缓存取 |
| 协商缓存 | 从缓存取 | 304(not modified) | 是,通过服务器告知浏览器缓存是否可用 |
怎么用?请求头里面需要用哪些参数?
强制缓存
需要设置Cache-Control字段中的max-age参数,max-age的值表示的资源有效时间,比如max-age=300就是5分钟内有效。
Cache-Control还有四个常用的参数:
- public:表示资源可以被终端用户和CDN等中间代理服务器缓存
- private:资源不能被中间代理服务器缓存,只能终端用户缓存
- no-cache:跳过强制缓存,使用协商缓存。一般情况下是强制缓存不命中才会调用协商缓存。
- 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 则与被请求资源的相应校验串进行比对,决定是否命中协商缓存。