http头部如何对缓存的控制
使用缓存的目的就是在于减少计算,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头部如何对缓存的控制
最新文章
- xcode低版本调试高版本真机系统
- 【转】Solr安全设置——对外禁用管理后台
- 常用的js函数
- c++ ip地址的操作 c版
- Deep Learning(深度学习)学习笔记整理系列之(五)
- lucene分词多种方法
- nodejs教程:安装express及配置app.js文件
- CSS3 :target伪类实现Tab切换效果 BY commy
- js判断手机或Pc端登陆.并跳转到相应的页面
- OpenGL结合C#进行绘图
- CUDA版本的OpenCL在windows 7的下编程初步
- 网络浅析(<;<;网络是怎么连接的>;>; 总结)
- Golang 入门 : 打造开发环境
- Django-视图层(view)
- JAVA体系学习-导向
- Vue如何更新子组件
- Oracle impdp的ignore及 fromuser / touser 功能
- typedef typename
- linux 虚拟机挂载光驱
- windows下Oracle Tuxedo编译应用前需要配置的相关环境变量
热门文章
- luogu3911 最小公倍数之和(莫比乌斯反演)
- [USACO08NOV]安慰奶牛Cheering up the Cow BZOJ 1232 Kruskal
- excel测试数据导入
- 【Leetcode】Permutation Sequence
- js常用代码收集
- visual studio 2013 error: Page &#39;312e8a59-2712-48a1-863e-0ef4e67961fc&#39; not found.
- hdu Minimum Inversion Number(逆序数的小知识与线段树)
- linux 学习2 (基于ubuntu)
- Jenkins自动化CI CD流水线之7--流水线自动化发布PHP项目
- git 合并某个提交commit到指定的分支上