强缓存和协商缓存

强缓存
强制把资源缓存起来
头部信息

同时cache-control还有一些其他的值:
1)public/private:public表示客户端和代理服务器(如CDN)都可以缓存,private(默认值)表示只有客户端可以缓存
2)on-cache/no-store:no-cache客户端缓存内容,但是是否使用缓存需要经过协商缓存来验证决定;no-store所有内容都不会被缓存,即不使用强缓存,也不是用协商缓存

协商缓存
在强缓存失效后,浏览器携带缓存标示向服务器发起请求,由服务器分局缓存标示决定是否使用缓存的过程
头部信息

Last-Modified/If-Modified-Since 和 ETag/If-None-Match

1、Last-Modified/If-Modified-Since

  1. 浏览器第一次发送请求,让服务端在response header中返回请求的资源上次更新时间(Last-Modified的值),浏览器会存下这个时间;

2)当浏览器下次请求时,request header中带上If-Modified-Since(即保存的Last-Modified的值)。根据浏览器发送的修改时间和服务端的wh修改时间进行比对,一致的话代码资源没有改变,服务端返回正文为空的响应,让浏览器在缓存中读取资源,从而减少请求消耗。

缺点:

  1)从上图可以看到Last-Modified保存的是绝对时间,并且是精确到秒,所以如果资源在1秒内修改了多次的话,那就无法识别;

  2)对于文件只改变了修改时间,内容不变,这时候也会使缓存失效,其实这个时候我们是不希望客户端重新请求的;

  3)某些服务器不能精确的得到文件的最后修改时间;

2、ETag/If-None-Match

  1. 浏览器第一次发送一个请求得到ETag的值,然后在下一次请求request header中带上If-none-match(即保存的ETag的值);

2)通过发送的ETag的值和服务器重新生成的ETag的值进行比对,如果一致代表资源没有改变,服务器返回的正文为空的响应,让浏览器从缓存中读取资源,从而减少请求消耗。

ETag的工作机制跟Last-Modified基本一样。但是,ETag是对资源内容使用抗碰撞散列函数(我也不知道是啥),使用最近修改的时间戳的哈希值。ETag解决了Last-Modified上述问题。

缺点:
ETag虽然能解决问题,但也并非完美,ETag每次服务端生成都需要进行读写操作(因为要生成hash),而Last-Modified只需要读取操作,ETag消耗更大一些。

总结

由此可见,协商缓存其实受强缓存的影响,强缓存过期了且Cache-Control不为no-store时是否缓存才由协商缓存决定。

posted @ 2020-12-31 15:55  李亚静  阅读(134)  评论(0)    收藏  举报