缓存大致可以分为以下几类:
1:本地缓存(应用层缓存)
2:浏览器缓存(HTTP缓存)
3:CDN缓存
4:代理服务器缓存
5:数据库缓存
1:本地缓存
进入Chrome开发者模式,选择application,然后我们来一项一项的看右边用红方框圈出来的部分。
如下图 ↓↓↓↓↓↓
2:浏览器缓存(HTTP缓存)
① 强缓存
概述:
强缓存是利用HTTP请求头中的Expires和Cache-control来控制的。
当请求再次发起时,浏览器会检测expires和cache-control来判断资源是否过期,如果没过期会直接使用缓存,不再向浏览器发起请求。如果过期了,会查看协商缓存,向浏览器发起请求。
当expires和cache-control同时存在时,cache-control拥有更高的优先级。
综上所述符合强缓存策略的特点:
❀ 不会向服务器发起请求,从缓存中读取资源信息
❀ 返回状态码200
❀ chrome打开开发者模式network中的size栏显示from memory cache(读取的缓存来自于内存缓存)或者是from disk cache (读取的缓存来自于硬盘)。浏览器会在js和图片等文件解析执行后直接存入内存缓存中,而css文件则会存入硬盘文件中。
下边我们上张参考图
Expires:
它是HTTP/1.0的产物,值为GMT时间,表示缓存的有效时间。
Cache-control:
cache-control是HTTP/1.1的产物。
它即可以在请求头中使用,又可在响应头中使用。同一个值在响应头和请求头中代表着不同的含义。可选的值也很多。
② 协商缓存
概述:
协商缓存是在强制缓存失效后,浏览器会携带缓存标识向服务器发起请求,服务器会根据携带过来的标识做判断浏览器是否需要使用缓存并对浏览器做出合适的响应。
主要控制字段有两对,一对是Last-Modified和If-Modified-Since,另一对是ETag和If-None-Match。
Last-Modified 和 If-Modified-Since:
浏览器在第一次访问资源时,服务器会在response header中添加一个Last-Modified的字段,这个字段代表该资源在服务器上最后的修改时间。浏览器接收后会缓存文件和header。
下一次访问的时候,浏览器会在request-header中添加上If-Modified-Since字段,其值就是第一次响应header中的Last-Modified的值。然后服务器收到该请求后,会将这个值与服务器上该资源的最后修改时间进行比对。如果相同,就响应浏览器304,让浏览器去读取缓存。如果不同就返回最新的资源,响应状态码为200。
ETag和If-None-Match
Etag是上一次加载资源时,服务器响应浏览器response header中的字段。它是对该资源的一种唯一标识,只要资源有变化,Etag值就会变化。
然后浏览器在下一次请求时会在request header中添加上if-none-match这个字段,其值为上一次缓存的Etag的值。服务器收到请求后会拿这个值去比对服务器上该资源的Etag值。如果相同,向浏览器返回304,让浏览器使用缓存。如果不同则响应浏览器状态码200并把最新资源发送给浏览器。
两种协商缓存方式对比:
❀ 在精确度上,Etag要优于Last-Modified,Last-Modified的时间单位是秒。如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有什么变化。但是Etag每次都会改变,确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
❀ 性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
❀ 优先级上,服务器校验会优先考虑Etag。
3:CDN缓存
CDN概述:
CND全称Content Delivery Network, 即内容分发网络。
它是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术
CDN缓存策略:
CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的Cache-control:max-age的字段来设置CDN边缘节点数据缓存时间。
当客户端向CDN节点请求数据,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端。否则,CDN节点就会向源站发起回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。
CDN服务商一把会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。
CDN缓存时间会对“回源率”产生直接的影响。若CDN缓存时间较短,CDN边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若CDN缓存时间太长,会带来数据更新时间慢的问题。开发者需要增对特定的业务,来做特定的数据缓存时间管理。
CDN缓存刷新:
CDN边缘节点对开发者是透明的,开发者可以使用CDN服务商提供的“刷新缓存”功能来强制CDN节点上的数据缓存过期,更新缓存,保证客户端在访问时,拉取到最新的数据。
CDN的优势:
❀ CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
❀ 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。
CDN的缺点:
当网站更新时,如果CDN节点上数据没有及时更新,即便用户在浏览器上使用Ctrl +F5的方式刷新,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。