缓存
-
缓存是什么? 是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷
-
缓存分类 HTTP缓存 和 浏览器缓存
浏览器缓存
Cookie LocalStorage SessionStorage applicationCache 本地存储大容量(WebSql和Index) 往返缓存(BFCache)
HTTP缓存
浏览器环境是根据http报文的缓存标识进行的。第一次请求,浏览器会根据响应报文中HTTP头的缓存标识判断是否将结果和缓存标识进行缓存,n+次请求,浏览器会查找该请求的结果以及缓存标识。
扩展:HTTP报文:
-
request请求:
请求行 http头(通用信息头 请求头 实体头) 请求主体
-
response响应:
状态行 http头(通用信息头 响应头 实体头) 响应主体
缓存结果:
浏览器资源size的类型为from cache,请求响应的 status为 200 或304
1. 200 from cache(强缓存)
2. 304 not modified(协商缓存)
强缓存
向浏览器查找请求结果,并根据缓存的规则判断是否使用缓存。控制强缓存的字段为:Expires和Cache-Control,其中Cache-Conctrol的优先级比Expires高
结果:
- 不存在该缓存结果和缓存标识,直接发请求
- 存在缓存和缓存标识,但失效,使用协商缓存
- 存在缓存和缓存标识,未失效,使用缓存,直接返回缓存结果
Expires
HTTP/1.0控制网页缓存的字段,起值为服务器返回该请求的结果缓存的到期时间(问题:客户端与服务端的时间不一致)
Cache-Control
HTTP/1.1的字段:其值是:public private no-cache no-store max-age=xxx (xxx is numeric)
注: 内存缓存(from memory cache) 硬盘缓存(from disk cache)
协商缓存
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。
结果:
- 协商缓存生效,返回304
- 协商缓存失败,返回200和请求结果
Last-Modified / If-Modified-Since
Last-Modified:是服务器响应请求时,返回该资源文件在服务器最后被修改的时间
If-Modified-Since:是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头含有If-Modified-Since字段,则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后被修改时间大于If-Modified-Since的字段值,则重新返回资源,状态码为200;否则则返回304,代表资源无更新,可继续使用缓存文件
Etag / If-None-Match
Etag:是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)
If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200