缓存

DNS缓存

  • 缓存URL与IP对应关系

CDN缓存

  • 服务器缓存,让请求到就近的服务器上面获取资源,本身有过期机制,过期会向根服务器请求资源

浏览器缓存

  • 分为强缓存和协商缓存
  • 缓存一般保存在内存或硬盘上
  • 一般把不需要频繁读取的文件放在硬盘上,如CSS,而需要频繁加载的内容保存在内存上,如JS,以减少IO开销。
  • 缓存过程一般先从内存找,没有去硬盘找,再没有发起网络请求,然后缓存资源,以备下次使用。

强缓存

  • 无需发起网络请求,直接从本地读取缓存
  • 相关协议头:Expires、Cache-Control
  • Expires中可以设置一个绝对过期时间,浏览器会根据本地时间对比,来判断是否已经过期,从而选取读取缓存与否
  • Expires缺点是,所写的是绝对时间,本地时间和服务器时间可能存在偏差,导致资源不能及时更新
  • Cache-Control可以设置一个相对时间(max-age),以秒为单位
  • 浏览器读取到资源后根据Cache-Control的相对时间,计算其过期时间,再下一次读取资源时回去判断是否过期,从而选择读取缓存与否
  • Cache-Control中可以设置以下几个属性

    • no-cache,设置了即进行协商缓存
    • no-store,不缓存
    • public,除终端用户外,中间服务器如CDN等都可以对资源进行缓存
    • private,只有终端用户可以对资源缓存
  • Cache-Control比Expires优先级高

协商缓存

  • 与强缓存的区别是,需要额外发送一个请求至服务器,去判断是否需要更新资源,强缓存没有命中时会进行协商缓存
  • 相关协议头:Last-Modify/Last-Modify-Since、ETag/If-None-Match
  • Last-Modify是服务器返回给用户的,里面是一个时间值,进行协商缓存时,用户会把该值放到Last-Modify-Since里面,返回给服务器,服务器根据该时间判断资源是否更新,缓存是否过期,若无需更新,则返回304给服务器,服务器从缓存读取资源,若过期,则返回资源给用户,用户使用新资源,同时更新缓存
  • Last-Modify缺点是,资源可能只是周期更新,比如做活动,周一到周五资源都不一样,但每周一的资源是一样的,使用modify判断由于是时间纬度的,所以每天都需要更新
  • ETag/If-None-Match逻辑与modify相同,但其给每个资源分配了一个唯一的标志,根据该标志来判断是否需要更新资源,若同一个文件,其Etag改变了,则需要更新,否则无需更新,所以可解决周期性更新的问题
  • ETag比Last/Modify优先级高,同时使用时,先判断ETag再判断Modify

你可能感兴趣的:(前端)