技术总结 - HTTP缓存
参考视频
缓存的重要性
缓存就是在申请资源时缓存提供方保存一份副本,当再次请求时若符合条件(通过缓存判断)即将保存的副本直接返回给请求资源方。利用缓存我们可以减少不必要请求,减少服务端的压力,减少资源占用。
缓存的技术有很多,如代理缓存
,浏览器缓存
,网关缓存
,负载均衡器
以及分发网络
等。
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需要付出额外的计算开销。如果文件非常大就会产生较大的性能影响。