HTTP基础之九(Web Cache—Cache-Control,If-Modified-Since,ETag)

Cache处理的基本过程

①读取请求——>②解析请求,提取URL和headers——>③查阅,缓存的副本是否可用,如果不可用,请求服务器更新——>④检查缓存是否最新——>⑤构建响应使用新header——>⑥发送——>⑦记录日志

 

保持缓存副本更新

文档过期:使用Cache-Control(HTTP/1.1 推荐)和Expires响应头(HTTP/1.0+),这里推荐使用Cache-Control:max-age=3600(s),相对当前日期往后1小时,Expires是绝对过期(这个取决于用户的电脑时间)。

当然,不是说客户端设置的Cache-Control到期以后,本地缓存就一定和服务器上的文档不一致,所有服务器端会进行再次校验,如果有改动则获取更新,如果没有则更新header

使用条件方法再校验

HTTP允许发送一个带条件的GET到服务器,满足响应的条件来执行更新。最常用的方式有两个(头)

If-Modified-Since:<date>

如果文档在指定的时间以后修改了,条件返回true,更新的文档会从服务器返回到缓存;如果没有修改(与last-modified date进行比较),返回304 Not Modified,这时不需要返回body,返回header就可以(为了提升性能),而且header也是需要更新的才返回,比如Content-Length就不需要返回,Expires日期(或Cache-Controller)就需要更新返回。

If-None-Match:<tags>

有些情况下,可能内容会被重写,但是不会改变内容,这时用上面的If-Modified-Since来判断就不准确了,为了解决这个问题,HTTP允许比较文档的版本号称为(ETags)。这个ETag是随意一串文字,可能包含一个数字或者是别的校验码。例如If-None-Match:”V2.1″,ETag:”V2.1″。

HTTP支持强弱检查,如果是稍微更新了,不是重要的内容,可以不更新副本。格式如:ETag: W/”v2.6″   If-None-Match: W/”v2.6″

 

何时使用ETag和Last-Modified Dates

HTTP/1.1客户端在接收到服务器端返回了ETag,那么就必须使用ETag判断;如果服务器端仅仅返回Last-Modified,客户端可以使用If-Modified-Since进行判断。如果返回了ETag和Last-Modified,则都需要进行判断。

 

Cache-Control

HTTP/1.1 提供多种方式来控制缓存对象:

① Cache-Control: no-store 禁止生成缓存,作为一个非缓存的代理服务器
② Cache-Control: no-cache 会缓存,只是在没有验证缓存更新的情况不能使用该缓存,所以这个名字可能容易误解。

③ Pragma: no-cache 这个是为兼容HTTP/1.0+,同Cache-Control:no-cache

④ Cache-Control: max-age=3600,如果不缓存可以max-age=0

⑤ Expires:Mon Mar 28 2016 17:32:22 GMT+0800 绝对过期截止时间

⑥ Cache-Control: must-revalidate 必须校验更新

⑦ 探索性过期:如果响应头里面没有Cache-Control: max-age以及Expires,那么会使用一个常见的LM-Factor算法来进行缓存,一般(1h或1day)

 

增量更新(Delta Encoding):A-IM(Accept-Instance-Manipulation),IM

 

ps:浏览器的刷新按钮发起的是GET请求,请求头添加了Cache-Control强制校验

作者:张雪飞
出处:https://zhangxuefei.site/p/1076
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注