web缓存分为:数据库缓存、服务器缓存(代理服务器、cdn缓存)、浏览器缓存
浏览器缓存分为:http缓存、indexDB、cookie、localstorage
http缓存分为:强缓存、协商缓存
强缓存
浏览器根据资源http头信息,判断是否命中强缓存,如果命中,加载缓存中资源,不会将请求发送到服务器
1、Expires(http1.0的属性)
响应头、代表资源过期时间,优先级低于Cache-Control值为max-age=xx秒;GMT格式日期
缺点:如果强行修改客户端日期,会引起缓存混乱
2、Cache-control
请求/响应头属性,缓存控制字段,有一下几个值
no-store:所有内容都不缓存
no-cache:浏览器使用换存前,都会请求服务器判断缓存是否为最新
max-age=x(单位秒):请求后x秒内不再发起请求,http1.1属性,优先级高于Expires
s-maxage=x(单位秒):代理服务器请求源站缓存后的X秒不再发起请求,只对CDN缓存有效
public:客户端和代理服务器都可缓存
private:只有客户端可以缓存
协商缓存
如果没有命中强缓存,浏览器会将请求发送到服务器,服务器根据请求头的信息判断浏览器本地的缓存是否过期,如果未过期,返回304,浏览器继续从缓存中加载资源,验证信息的字段分为两个:
1、Last-Modify、If-Modify-Since
Last-Modify:请求资源响应头字段,标识该资源最后的修改时间
If-Modify-Since:请求资源请求头字段,值为上一次请求的Last-Modify,服务器根据该值判断缓存是否过期
缺点:
Last-Modify只能精确到秒级,如果1秒内被多次修改,不能标注文件的修改时间
若果某些文件定期生成,内容没变,Last-Modify变了,导致不能使用缓存
客户端与服务器时间不一致的情况
2、ETag、If-None-Match(优先级高于Last-Modify)
ETag:功能与Last-Modify类似,响应头中字段,不同的是该值为一个校验码,保证资源唯一
If-None-Match:请求头中字段,值为上一次请求的ETag