HTTP缓存

缓存类型

  缓存是一种保护资源副本并在下次请求时直接使用该副本的技术。如果某项数据已经被缓存,它会拦截请求,返回该资源的副本,而不去源服务器请求数据。

  好处:减缓了服务器的压力,提升了性能;

  但是,缓存需要合理配置,缓存时间的设置,还有缓存应截止到下一次发生改变(既不能缓存过期的资源)

  缓存的类型:

    私有缓存:只用于单独的用户

    共享缓存:能够被多个用户使用;

缓存响应状态码:

  常见的状态码:

    1**----信息/服务器收到请求,需要继续执行操作

    2**---成功,操作杯成功接👋,请继续处理

    3**---重定向,需要进一步操作已完成请求

    4**---客户端cuowu,请求包涵错误或无法完成请求

    5**---服务器端错误或在请求过程中发生了错误

    200---ok,响应成功,一般使用于get与post请求

    202---appected已接受请求,但未完成处理

    301---moved permanebtly 永久性重定向

    302---found临时性重定向

    303---see other查看其他地址

    400---bad request 客户端请求语法错误,服务器无法理解

    401---unauthorized 请求要求用户认证

    402---payment required 保留,将来使用

    403---forbidden 服务器理解客户端的请求,但是拒绝执行此请求

    404---not found 服务器无法提供客户的请求大的源网页

    500---Internal Server Error 服务器内部错误,无法完成该请求

    505---HTTP Version not supported 服务器不支持请求的http协议的版本,无法完成处理 

缓存控制---cache-control头

  禁止进行缓存--缓存中不得存储任何相关客户端的请求和服务端相应的内容。每次有客户端发起的请求都会下载完整的内容

      cache-control:no-store

      cache-control:no-cache,no-store,must-revalidate

  强制确认缓存--每次发送请求时,缓存会讲此请求发送到服务器,服务器端会验证请求中的缓存是否过期,若未过期,则直接使用缓存中的数据

    cache-control:no-cache

  私有缓存和公共缓存

    cache-control:private---私有缓存

    cache-control:public---公有缓存

  缓存过期机制---过期机制中,最重要的指令是"max-age=..."//毫秒数

   缓存验证确认---使用must-revalidate指令,缓存在考虑使用一个旧的资源的时候,就必须先要验证它的状态。已经过去的缓存不能被应用 

    param头---向后兼容HTTP/1.0的客户端

新鲜度

   当一个资源被缓存后,该资源可能会永久性的存储在缓存中,由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除(缓存驱逐);还有就是当服务器的资源更新后,缓存中的旧资源也应该被及时更新;

             HTTP协议是C/S模式(Client/Server)的协议,当服务器资源更新时,客户端的缓存不会主动更新,因此需要彼此约定一下时间期限。

缓存失效时间计算公式如下:expirationTime = responseTime + freshnessLifetime - currentAge

加速资源

    更多地利用缓存资源,可以更好解决网站性能和相应的速度。为了优化缓存,可以设置尽可能的缓存时间。但是,对于定期更新的资源,这么做是比较好的。但是对于长期不变的固定资源在一定时间内缓存受益于这种长期保持的缓存策略。但是一旦更新的话就比较困难。(只要针对在网页上引入js/css文件,当他们变动时,需尽快更新线上资源)

    Steve Sounders (加速技术)---使用特定的命名方式,在URL后面添加版本号。加上版本号后的资源就是一个完全新的独立的资源,同时拥有一年甚至更长的缓存期限。弊端:所有引用这个文件的地方都需要更新。解决方法:一般在开发中会采用自动化构建工具完成这些琐碎的工作。当低频更新的资源(js/css)变动了,只用在高频变动的资源文件(html)里做入口的改动;好处:同时更新两个缓存资源不会造成部分缓存更新而引起新旧文件内容不一致,对相互依赖的css和js文件,避免这种不一致性很重要。

缓存验证

  用户刷新页面时开始缓存验证,如果缓存的响应头信息中有Cache-control:must-revalidate的定义,在浏览过程中,也会触发缓存验证。此外,在浏览器的偏好设置Advanced->Cache为强制验证缓存也能达到相同的效果。

ETag:响应头是一个对UA不透明的值。如果资源请求头中含有ETag,客户端可在后续的请求头中带上if-month-match头来验证.

Last-Modified响应头可以作为一种若校验器,精确度低,只能精确到一秒

带Vary头的响应

使用vary头有利于内容服务的多样性。

eg:使用vary:user-agent头,缓存服务器需要通过UA哦安短是否使用缓存的页面。如需要区分移动端和桌面端的内容展示,利用这种方式就可以避免在不同的终端显示错误的布局。此外,还可以帮助搜索引擎更好地发现页面的移动版本(因为移动版和桌面的客户端的请求头中的User-Agent不同, 缓存服务器不会错误地把移动端的内容输出到桌面端到用户。)。且告诉搜索引擎没有引入cloaking

 

 

    

    

     

  

    

 

posted @ 2018-03-13 19:21  前端加油站  阅读(156)  评论(0编辑  收藏  举报