H5开发

Web缓存分析

2016-07-09  本文已影响162人  Zane96

前言

不论是在移动端还是前端,web缓存(Http缓存)都是很重要的一部分。在移动端,对于用户流量控制的优化,web缓存就起到了决定性的作用。最开始接触这块是在使用OkHttp的拦截器修改Http请求头进行web缓存,后来仔细研究了一下这块。而Web缓存就是客户端和服务端之间通过一种约束,通过新鲜度校验来给客户端提供缓存资源。

Web缓存的好处

Web缓存的分类

共有缓存和私有缓存

Web缓存的层次结构

一般来说,安卓中的图片多级缓存和这个概念不大相同,这里的多级缓存的意思是在客户端和服务端之间部署多级缓存。常见部署如下:

Web缓存的流程

先上张图:

web.png
  1. 在客户端发起一次请求的时候,首先一层一层的缓存会根据算法判断缓存中是否存在文档副本,如果不存在的话就会像资源服务器或者父代理缓存服务器(上一级缓存服务器)继续请求客户端需要的资源。
  2. 如果资源副本存在的话就会根据资源的元数据(记录资源在缓存中保存了多长时间以及它被用了多少次)来计算资源的新鲜度,如果资源新鲜的话就直接返回给客户端。
  3. 如果不新鲜的话,会判断资源在缓存中的副本和在资源服务器里面的文本副本是否一致,如果一致表示资源未发生改变,那么仍然还是由缓存返回。
  4. 如果资源发生改变,那么由资源服务器来返回资源给客户端,并且用这份资源存入缓存中。

大致流程就是这样,请求-检验-在验证,下面对于过程的细节详细说说:

文档过期的判断

缓存数据是否过期是由数据的使用期和过期日期共同决定的。

Cache-Control: max-stale = <s> 在指定的秒数里面缓存可以提供过期了的数据
Cache-Control: max-age = <s> 在指定的秒数里面,缓存里面的数据不会过期
Cache-Control: min-fresh = <s> 至少在未来数秒内数据要保持新鲜
Cache-Control: private or public 私有缓存或者共有缓存
Cache-Control: no-cache 提供数据之前必去要去和资源服务器的数据进行比对判断数据是否更新
Cache-Control: no-store 禁止一切缓存
Cache-Control: must-revalidate 告诉缓存,必须严格遵循服务器的规定,验证之后才能提供过期的数据
Cache-Contero: only-if-cached 只有当缓存中有副本的时候,客户端才能获取一份数据副本

需要注意的是

  1. no-cache 不是不使用缓存而是必须比对了之后才能提供,no-store才是完全禁止缓存
  2. 优先级:no-staore>no-cache>must-revalidate>max-age>Exprise

在移动端的开发中,如何控制我们的数据缓存过期时间需要移动端和后台共同商量之后得出一套方案,比如像数据不停变换更新的并且数据量不大的,应该禁用缓存以保证数据的及时性,像周刊,课表这种长期不变的数据应该添加上合理的缓存时间。

web2.png

可以看出其实是忽略了客户端到缓存的网络传输时间,多算了缓存到资源服务器的网络传输时间。

再验证

如果第一次缓存未命中的话,就会进行服务器再验证。用来判断服务器的资源是否发生改变。

If-Modified-Since与Last-Modified(基于Date的再验证)

If-Modified-Since是请求字段,值为一个绝对时间,用于通知服务器在这个时间之前,默认资源是未被修改的(不去进行再验证),如果超过了这个时间,就会将这个时间和资源最后修改的时间进行对比,如果小于资源最后修改的时间,那么Last-Modified响应首部会返回资源最后被修改的时间,并且返回200.如果大于最后修改的时间,那么Last-Modified响应首部会返回304表示资源未被修改。

If-None-Match和ETag(基于实体标签的再验证)

ETag可以看作是资源的版本号,并且在强验证器下,资源发生细微的变化都会导致ETag的变化,在弱验证器下,资源发生细微的变化都不会导致ETag的变化,这个“细微”度量标准是由后台开发人员来确定的。客户端可以根据If-Modified-Since来添加你现在所拥有的ETag版本号,发送给服务器,然后服务器进行比较。如果版本号不同,那么就会返回200,并且将最新的ETag值添加到ETag响应头里面。如果相同,返回304。
两者之间并没有优先级之分,如果同时存在,那么客户端和服务端应该将两者综合起来考量。

未经博主同意,不得转载该篇文章

上一篇 下一篇

猜你喜欢

热点阅读