前言:http缓存作为web性能优化的重要手段,是需要掌握的一个知识点,本文将围绕着http缓存进行以下几点描述:
- 缓存类型
- 缓存方案
- 缓存优缺点
- 缓存优先级
1、缓存类型
http缓存分为两大类型,强制缓存(强缓存)和协商缓存,存在缓存规则上的不同;
强制缓存
强缓存是指在指定时间内(缓存未失效的情况下),客户端将不再发送请求给服务端,而是通过缓存的方式从事先存储的内存或磁盘中获取信息;
协商缓存
协商缓存是指在使用本地缓存之前,需要向服务端发起一次GET请求,与之协商当前浏览器保存的数据信息是否过期,通常采用请求资源修改的最后一次时间戳来进行判断,如果未过期服务端返回304,客户端直接中缓存中读取数据,如果已过期,服务端返回最新的数据信息;
2、缓存方案
强制缓存
Expires
Expires的值代表服务端返回缓存的过期时间,再次发起请求后,根据此时间来判断缓存是否过期,但同时也会存在问题,客户端与服务端的时间如果存在偏差,会影响缓存命中的准确性;
Cache-Control
为了解决expires判断的局限性,从HTTP1.1协议后开始新增了cache-control字段来对expires的功能进行扩展和完善,优先级高于expires,且在项目中可使用cache-control代替expires,同时cache-control有以下参数配置选项:maxage=10(单位秒)强制缓存,多少秒后到期;no-store则代表禁止缓存;no-cache表示协商缓存,需要使用协商缓存来进行验证;private与public也是互斥属性值,用以明确响应资源是否可被代理服务器进行缓存,默认为private私有缓存;
协商缓存
Last-Modified
响应头,资源最近修改时间,由服务端告诉客户端,与If-Modified-Since一起使用,需开启协商缓存设置cache-control为no-cache;
If-Modified-Since
请求头,首次请求后,客户端保存该字段,在之后的请求中由客户端告诉服务端;
同样,这两个能满足大部分的使用场景,但也存在问题,首先它只是根据资源最后的修改时间戳进行判断,虽然请求的文件资源进行了编辑,但是内容并没有发生任务变化时,时间戳也会更新,导致协商缓存时有效性的判断验证失效,需要重新进行完整的资源请求,会造成网络带宽资源的浪费;同时,如果修改文件非常快,假设几百毫秒就完成了修改,同样会造成资源无法更新的问题,造成问题的原因是因为服务器无法仅依靠资源修改时间戳来识别出正确的更新。
ETag
响应头,为了弥补通过时间戳判断的不足,从HTTP1.1规范开始新增了一个ETag的头信息,通过此字段客户端与服务端建立唯一标识联系;
If-None-Match
请求头,与Etag共同使用,再次发起请求后,客户端请求头中会包含此字段,与服务器被请求支援标识进行对比,相同则说明资源无更改,返回状态码304;不同则说明资源修改,返回最新资源以及状态码200;
3、缓存优缺点
优点
1、减少了冗余的数据传递,节省宽带流量
2、减少服务器负担
3、加快网页加载速度
4、用户体验得到提示
缺点
1、缓存中数据可能与服务端数据不一致
2、消耗内容
4、缓存优先级
Cache-Control > Expires > ETag > Last-Modified