#缓存
浏览器在请求网页资源的时候,不会直接从服务器去获取,而且先判断是否命中缓存,如果命中了,会从缓存设备里面去获取资源,如果没有命中,则从服务器获取
优点
- 减少数据传输,降低带宽
- 减少请求,从而减少服务器压力,提高性能
- 加快网页响应速度
#缓存分类
缓存分为强制缓存和协商缓存
- 浏览器在请求某一资源时,判断是否命中强缓存(cache-control和expires信息),若命中直接从缓存中获取资源信息,本次请求就不会与服务器进行通信
- 如果没有命中强缓存,浏览器会发送请求到服务器,由服务器来判断是否协商缓存命中。若命中,则浏览器可以直接从缓存获取;否则从服务器获取最新的资源内容。
#区别
缓存 | 获取资源形式 | 状态码 | 发送请求到服务器 |
强缓存 | 从缓存获取 | 200(from cache) | 否,从缓存获取 |
协商缓存 | 从缓存获取 | 304(not modified) | 是,通过服务器判断 |
#如何命中强缓存
- Expires:response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存。
- Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。
#如何命中协商缓存
- Last-Modify/If-Modify-Since:浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间;当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存
- Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。
- If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定是否命中协商缓存;