cache策略实现的原理(200、304返回码含义)

什么是cache?

定义:浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。

cache的作用:

1、减少延迟,让你的网站更快,提高用户体验。
2、避免网络拥塞,减少请求量,减少输出带宽。

 

页面内容Cache策略:

目前我们业务的JS、css、静态页面文件和图片等资源放在imgcache域名机器上,是由运维人员在apache上统一设置缓存策略。前台通过Http请求的回调包来展现,其中关键的两个属性就是Expires和Cache-Control。Expires设置对象的有效期,是HTTP/1.0规范;max-age是Cache-control的一个指令设置对象的年龄(秒数),是HTTP/1.1规范,max-age优先级高于Expires。

Cache-Control中的max-age是实现内容cache的主要手段,共有3种常用策略:max-age和Last-Modified(If-Modified-Since)的组合、仅max-age、max-age和ETag的组合。

 

I、max-age和Last-Modified(If-Modified-Since)的组合:

我们的业务中用的比较多的是max-age和Last-Modified(If-Modified-Since)的组合,现在详细介绍一下,这个策略是在给出max-age的同时,给出一个资源的验证方式:Last-Modified,标示这个响应资源的最后修改时间,例如Last-Modified: Thu, 08 Apr 2010 15:01:08 GMT,这个属性只有配合Cache-control的时候才有实际价值,利用资源的可校验性,可以实现在cache的资源超过max-age浏览器再次请求时的304响应,令浏览器再次使用之前的cache

第一步:

1、浏览器第一次请求资源http://imgcache.qq.com/paipai/cos/portal/js/spu.js

2、浏览器查询临时文件目录发现无cache内容,于是发出请求到web server

3、Web server接到请求,响应资源,并设定Cache-control:max-age=600,Last-Modified: Wed, 29 Sep 2010 09:59:03 GMT

4、浏览器接到响应,将内容展示的同时,在临时文件目录以“http://imgcache.qq.com/paipai/cos/portal/js/spu.js”为key缓存这个响应的内容

图示:首次请求,没有cache,结果是200,回包里包含max-age、Last-Modified。

 

第二步:

1、离第一步请求间隔时间不到10分钟

2、浏览器再次请求资源http://imgcache.qq.com/paipai/cos/portal/js/spu.js

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,还未过期,直接读取,响应给用户。(HTTP状态(Cache))

图示:在不到10分钟的间隔里,再次请求这个js文件,直接从cache里读取了内容

 

第三步:

1、离第一步请求间隔时间已超过10分钟

2、浏览器再次请求资源http://imgcache.qq.com/paipai/cos/portal/js/spu.js

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,已经过期,发现资源带有Last-Modified,于是在请求包中带上If-Modified-Since: Wed, 29 Sep 2010 09:59:03 GMT,发请求给web server

4、Web server收到请求后发现有If-Modified-Since,于是和被请求资源的最后修改时间进行比对,如果修改时间比请求包的时间新,说明资源已经被改过,则带包体响应回复整个资源内容(HTTP状态200);如果修改时间不比请求包的时间新,说明资源在这段时间内都没改过,无需回复整个资源,则仅响应包头,不带包体(HTTP状态304),告诉浏览器继续使用临时目录里的cache内容展示。

图示:不做清除cache的操作,1个小时以后,再次请求这个js文件,max-age已经过期了,但修改时间没变,所以304。

 

II、仅max-age

最基础的策略,只需要在回包的头字段里加入Cache-control: max-age=[secs]即可

如Cache-control: max-age=1800表明cache的时间是30分钟,只使用这样一个声明就可以使浏览器能够将这个HTTP响应的内容写入临时目录做cache

第一步:

1、浏览器第一次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

2、浏览器查询临时文件目录发现无cache内容,于是发出请求到web server

3、Web server接到请求,响应资源,并设定Cache-control:max-age=3600

4、浏览器接到响应,将内容展示的同时,在临时文件目录以“http://imgcache.qq.com/qqshow_v3/css/index_.css”为key缓存这个响应的内容

第二步:

1、离第一步请求间隔时间不到60分钟

2、浏览器再次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,还未过期,直接读取,响应给用户。(HTTP状态“(Cache)”)

第三步:

1、离第一步请求间隔时间已超过60分钟

2、浏览器再次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,已经过期,发起请求给web server。(HTTP状态“200”)

 

III、max-age和ETag的组合

这个策略是,在给出max-age的同时,给出另一种资源的验证方式:ETag标示这个响应资源由开发者自己确定的验证标识,例如ETag: "12345678"

同样这个属性也只有配合Cache-control的时候才有实际价值,是声明校验资源的方式,ETag的使用为实现304响应提供了更多的灵活性

第一步:

1、浏览器第一次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

2、浏览器查询临时文件目录发现无cache内容,于是发出请求到web server

3、Web server接到请求,响应资源,并设定Cache-control:max-age=3600,ETag: "12345678"

4、浏览器接到响应,将内容展示的同时,在临时文件目录以“http://imgcache.qq.com/qqshow_v3/css/index_.css”为key缓存这个响应的内容

第二步:

1、离第一步请求间隔时间不到60分钟

2、浏览器再次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,还未过期,直接读取,响应给用户。(HTTP状态“(Cache)”)

第三步:

1、离第一步请求间隔时间已超过60分钟

2、浏览器再次请求资源http://imgcache.qq.com/qqshow_v3/css/index_.css

3、浏览器查询临时文件目录发现有cache内容,于是检查max-age,已经过期,发现资源带有ETag,于是在请求包中带上If-None-Match: "12345678",发请求给web server

4、Web server收到请求后发现有If-None-Match,于是和被请求资源的验证串进行比对,如果校验串的内容不一致,则返回整个资源包体(HTTP状态200),如果校验串的内容一致,仅返回包头(HTTP状态304),告诉浏览器继续使用临时目录里的cache内容展示。

 

当前业务运维和开发的Cache策略:

1、 js文件:js文件是整个前台页面的灵魂,具有对于承担着前台页面主要功能,用户操作比较多的JS文件,运维人员设置cache一般为10分钟(max-age=600)。对于统计或者测速功能的JS文件,cache通常为一年(max-age=31536000),见下图所示:

    

2、 样式文件:与本业务相关,经常会有变动优化类的css文,运维人员设置cache一般为1个小时(max-age=3600),公共类的css文件cache通常为一年(max-age=31536000)。

3、 图片文件:根据图片修改的频率,经常需要优化的图片(本业务需要使用的),运维人员设置cache为1个小时(max-age=3600)。公共图片cache时间s久一些,比如static.paipaiimg.com域名下的某些图片cache达到一年时间。

4、 动静态文件:基本都是与业务相关联的页面文件,运维人员设置cache一般为1个小时(max-age=3600)。

5、 CGI/PHP文件:由开发人员根据CGI/PHP文件在业务中的具体功能,在代码中设置max-age的值,时间一般为1个小时。一般支持页面动态内容的CGI/PHP文件不需要设置cache,如商品的库存信息、商品信息等。

6、 尽量减少304返回码。

本文转载自http://www.51testing.com/html/43/434343-243768.html

时间: 2024-10-30 15:46:02

cache策略实现的原理(200、304返回码含义)的相关文章

android中图片的三级缓存cache策略(内存/文件/网络)_Android

1.简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多. 现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响.当然,我想,向百度美拍这样的应用,必然也有其内部的图片缓存策略.总之,图片缓存是很重要而且是必须的. 2.图片缓存的原理 实现图片缓存也不难,需要有相

android中图片的三级缓存cache策略(内存/文件/网络)

1.简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多. 现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响.当然,我想,向百度美拍这样的应用,必然也有其内部的图片缓存策略.总之,图片缓存是很重要而且是必须的. 2.图片缓存的原理 实现图片缓存也不难,需要有相

Scrapy response 请求200 但是返回的页面不完整

问题描述 Scrapy response 请求200 但是返回的页面不完整 python 爬虫抓取数据时,请求状态码200,但是返回的页面信息不完整 解决方案 一般这种情况是页面本身是异步加载的,所以你拿到了200,但是页面内容其实是ajax等异步填充进去的数据.目前这种页面你需要用selenium等带有webdriver的模块来抓取

httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的

问题描述 httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的 httpclient提交一个用于登录的请求,但是返回的都是200的状态码,如何判断怎么是成功的怎么是失败的呢? 解决方案 已解决,原因是由于学校的教务网出现问题了,才导致模拟不成功 解决方案二: 返回200说明在http层面都是成功的.你说的失败应该是指返回的数据中包含错误信息,那么你需要对返回的数据进行判断. 解决方案三: 如果返回的是200的话,那就是成功的!否则就是失败的! 解决方案四:

request-为什么设置了请求头为range格式,服务器返回码却是200而不是206呢?

问题描述 为什么设置了请求头为range格式,服务器返回码却是200而不是206呢? HTTP1.1 中的状态码与状态描述中有写道 206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新). 然后我的客户端代码: HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod(""GET&

分析网站日志中百度蜘蛛返回304状态码的情况

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 最近遇到一个网站被百度蜘蛛抓取首页后大量返回304状态码的问题,以前遇到过301和302,就是没了解过304,刚好可以对这个情况进行一下分析和观察,以便比较深入的了解该问题的出现以及应对之策. 百度百科对304状态码是这么解释的:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有

Windows API GetLastError()函数返回值含义解释_Delphi

[0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏. [8]-存储空间不足,无法处理此命令. [9]-存储控制块地址无效. [10]-环境错误. [11]-试图加载格式错误的程序. [12]-访问码无效. [13]-数据无效. [14]-存储器不足,无法完成此操作. [15]-系统找不到指定的驱动器. [16]-无法删除目录. [17]-系统无法将

百度快照不更新与HTTP 304状态码

前不久百度官方发表了一篇关于百度快照的说明,大体的解释了百度快照更新与倒退原因,并直接指出"网站快照与网站权重没有任何关系". 由于SEO基础知识的普及度不够,在交换友情链接的时候,还是有很多人拿网站快照作为主要参考标准之一,即使网站排名靠前.PR高,在把百度官方声明发给对方看,对方也很无奈的来了句上边领导要求没办法. 网站百度快照不更新与隔天更新 观察一些企业网站,发现关键词排名差不多的网站,同样是网站内容不更新,但是有的百度快照一直是隔天,有的就固定停在了某一天.   就此问题,笔

网站404页面返回码错误导致的网站被K案例分析

我站平安的度过了8月的K站风波,然而却在本月不幸中招,终于被K. 近两个月百度的算法调整误伤了很多高质量的网站.但我们依然认为这只是百度的暂时调整,相信百度会认真对待每一个站,只要坚持提供高质量内容得到用户认可,迟早有一天会恢复收录并取得更好的排名. 经过我详细的研究,详细研究各站长工具提供的数据,并分析百度蜘蛛访问日志等,发现本次被K事件的主因是由于网站大规模改版导致的文件丢失导致的大量死链后本站对错误页面的404返回码处理环节出现了重大问题.次要原因是被某些被黑客入侵篡改的高权重网站的外链指