技术总结-HTTP缓存

52 阅读3分钟

技术总结 - HTTP缓存

参考视频

www.bilibili.com/video/BV1Jr…

缓存的重要性

缓存就是在申请资源时缓存提供方保存一份副本,当再次请求时若符合条件(通过缓存判断)即将保存的副本直接返回给请求资源方。利用缓存我们可以减少不必要请求,减少服务端的压力,减少资源占用。

缓存的技术有很多,如代理缓存浏览器缓存网关缓存负载均衡器以及分发网络等。

HTTP缓存是我们前端人员最多接触的缓存了,也是面试官问的最多的,它可以分为强制缓存协商缓存,二者的区别是判断缓存命中时,浏览器是否需要向服务器端进行询问。

HTTP的强制缓存

首先客户端请求服务器拿到资源,服务器通知你可以进行强制缓存,如果下次再次请求,客户端可以在不通知服务端的情况下直接使用客户端的缓存。一般用于不会改变的静态资源。

强制缓存的使用方式

expires

在服务端添加响应头:Expires: '过期时间'即可。

如果未超过过期时间,就会从浏览器拿缓存。

它是HTTP1.0的缓存策略,如果客户端和服务端事件不一致,就会造成无法控制的情况

cache-control

为了解决expire的局限性,HTTP1.1新增cache-control字段

max-age字段:设置缓存的有效时间

{
  'cache-control' : 'max-age-5' //5s后过期,滑动时间
}

no-store:告诫浏览器不要缓存,浏览器收到消息后会清除自身的这条缓存。

no-catch: 强制进行协商缓存。

private/public:是否使用公共缓存,如果private,一些公共缓存服务器就不会缓存这条信息。默认为private,建议一些图片,css,js等静态信息改为public。

{
  'cache-control' : 'public,max-age-5' //5s后过期,滑动时间
}

S-maxage:单独设置代理缓存的过期时间

协商缓存的使用方式

last-modified

服务端返回资源携带返回头‘last-modified’ 和UTC时间戳(绝对时间)代表最后修改资源的时间。需要配合cache-control:no-cache使用。客户端返回时携带'if-Midified-Since'和绝对时间,服务端收到请求回复判断,如果资源有效,返回304即可,如果无效返回新资源。

他有两个比较明显的问题:只是根据修改的时间戳改变的,有可能资源被修改了但内容没改变(如修改文件名)此时也不会触发缓存。并且它只能精确到秒级,当出现毫秒级的修改操作有可能更新不及时。

E-tag

运行哈希运算为资源生成一个特殊的字符串,设置header 'etag',,以后客户端发送都会携带if-None-Match,只要哈希值不变,就会返回304缓存

缺点:Etag需要付出额外的计算开销。如果文件非常大就会产生较大的性能影响。