缓存是指代理服务器或客户端磁盘内保存的资源副本。利用缓存可减少对服务器的访问,因此也就节省了通信流量和通信时间。
浏览器缓存是为了节约资源,并且可以加速浏览网站的速度,当用户第一次访问网页的时候,浏览器在用户磁盘上对请求的文档进行保存,当第二次访问的时候,就会从本地直接显示,从而提高了页面的访问速度。
浏览器缓存的优点:
浏览器缓存分为强缓存和协商缓存。
区别:
强缓存命中,不会请求服务器,直接请求缓存;协商缓存命中,会请求服务器,不会返回内容,然后读取缓存。
from memory cache:字面理解是从内存中,这个资源是直接从内存中拿到的,不会请求服务器,一般是已经加载过该资源且缓存在了内存中,当关闭该页面时,该资源就被内存释放掉了,再次重新打开相同页面是,不会出现 from memory cache 的情况。
from disk cache:这个资源是从磁盘当中取出的,也是在之前的某个时间加载过该资源,不会请求服务器,但是此资源不会随着该页面的关闭关闭而释放掉,因为此资源是存在硬盘中的,下次打开仍会from disk cache。
强缓存,利用HTTP的返回头中的expires和cache-control两个字段来控制,用来表示资源的缓存时间(缓存的有效期)。
这种方法会有一个固定时间,但是如果服务器数据进行了更新,而强缓存的有效期还没有过期的话,则数据无法更新。
该字段是http1.0时的规范,它的值是GMT格式的绝对时间,浏览器进行第一次请求时,服务器会在返回头部加上Expires,下次请求,如果在这个时间之前就命中缓存。
该值是利用max-age判断缓存的生命周期,是以秒为单位,如果在生命周期时间内,则命中缓存。
协商缓存,由服务器来确定缓存资源是否可用,所以客户端与服务端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。
利用 Last-Modified,If-Modified-Since 和 ETag,If-None-Match 来实现。
Last-Modified:表示为实体头部部分,response返回,表示资源的最后更新时间;
If-Modified-Since:通过比较两次的时间来判断资源在请求期间是否有修改,如果没有修改,则命中协商缓存,浏览器从缓存中读取资源,如果没有命中,资源有修改过,则返回新的Last-Modified时间和服务器资源。
某些情况下仅判断最后修改日期来验证资源是否改动是不够的的:
ETag:为响应头部字段,表示资源内容的唯一标识,随服务器response返回;
If-None-Match:服务器比较请求头中的 If-None-Match 和当前资源中的 etag 是否一致,来判断资源是否修改过,如果没有修改,则命中缓存,浏览器从缓存中读取资源,如果修改过,服务器会返回新的etag,并返回资源。


强缓存和协商缓存的区别:
| 缓存类型 | 获取资源形式 | 状态码 | 发送请求到服务器 |
|---|---|---|---|
| 强缓存 | 从缓存取 | 200(from cache) | 否,直接从缓存获取 |
| 协商缓存 | 从缓存取 | 304(Not Modified) | 是,通过服务器来告知缓存是否可用 |