文章自于我的个人博客

使用缓存的目的就是在于减少计算,IO,网络等时间,可以快速的返回,特别是流量比较大的时候,可以节约很多服务器带宽和压力。

一个请求从缓存的方面来说,有三个过程。

本地检查缓存是否过期

Expires,http 1.0版本定义的response头部,定义过期时间,如果本地时间发现超过过期时间,就会向服务器请求,进行文件新鲜度检测。但是会有一个问题,就是本地的操作系统时间可能偏差比较大,导致缓存时间过长或者永远都缓存不了。

Cache-control: max-age,http 1.1 版本定义的response头部,就是为了解决操作系统时间与服务器时间相差太大问题。文件缓存存活时间,请求完毕的时候,会记录本地的时间。再次请求的时候,此时时间减去最初记录时间,如果时间大于max-age,就会进行文件新鲜度检测。

  • 如果浏览器使用本地缓存,通过chrome调试工具,可以看到,状态是200,size 是from cache。这个时候是没有http请求。
  • 如果缓存不存在或者没有定义这两个头部,直接进行下一步新鲜度检测。
  • 如果两个都定义的话,Expires无效。
  • 防止浏览器缓存,我们需要把两个头部都设置为0.

服务器检测文件新鲜度

本地缓存过期,缓存和服务器文件可能一样,也有可能不一样。如果一样的话,就没有必要返回内容。如果不一样,就返回内容,就相当于一次新的请求。

怎么判断文件是否一致呢?现在的做法通过文件生成时间或者对文件进行MD5值计算。

Last-Modified,文件生成时间或者最后修改时间。下一次请求的头部,添加If-Modified-Since,值是上次respone头部的Last-Modified值,和服务器进行对比,如果一样的话,直接返回304,数据内容为空。【这里也会存在一个问题,如果文件定期更新,但是文件内容不更新,岂不是白白耗费流量。】

Etag , 服务器端对文件计算出来的一个值。下一次请求的头部,添加If-None-Match,和服务器进行对比,如果一样的话,直接返回304,数据内容为空。

服务器返回数据内容

相当于一次新的请求,状态是200.

通过输出4个头部,来控制缓存,减少压力,不仅可以节省服务器和宽带资源,对用户的体验提升也是非常有帮组的。

整体上,可以看到可能出现的情况。200(from cache,无请求),304(仅仅是头部交换,没有response body返回),200(一次完整的请求,包含response body)。

 

转载请注明:万马奔腾 » http头部如何对缓存的控制



最新文章

  1. xcode低版本调试高版本真机系统
  2. 【转】Solr安全设置——对外禁用管理后台
  3. 常用的js函数
  4. c++ ip地址的操作 c版
  5. Deep Learning(深度学习)学习笔记整理系列之(五)
  6. lucene分词多种方法
  7. nodejs教程:安装express及配置app.js文件
  8. CSS3 :target伪类实现Tab切换效果 BY commy
  9. js判断手机或Pc端登陆.并跳转到相应的页面
  10. OpenGL结合C#进行绘图
  11. CUDA版本的OpenCL在windows 7的下编程初步
  12. 网络浅析(<<网络是怎么连接的>> 总结)
  13. Golang 入门 : 打造开发环境
  14. Django-视图层(view)
  15. JAVA体系学习-导向
  16. Vue如何更新子组件
  17. Oracle impdp的ignore及 fromuser / touser 功能
  18. typedef typename
  19. linux 虚拟机挂载光驱
  20. windows下Oracle Tuxedo编译应用前需要配置的相关环境变量

热门文章

  1. luogu3911 最小公倍数之和(莫比乌斯反演)
  2. [USACO08NOV]安慰奶牛Cheering up the Cow BZOJ 1232 Kruskal
  3. excel测试数据导入
  4. 【Leetcode】Permutation Sequence
  5. js常用代码收集
  6. visual studio 2013 error: Page '312e8a59-2712-48a1-863e-0ef4e67961fc' not found.
  7. hdu Minimum Inversion Number(逆序数的小知识与线段树)
  8. linux 学习2 (基于ubuntu)
  9. Jenkins自动化CI CD流水线之7--流水线自动化发布PHP项目
  10. git 合并某个提交commit到指定的分支上