文章自于我的个人博客

使用缓存的目的就是在于减少计算,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头部如何对缓存的控制



http头部如何对缓存的控制的更多相关文章

  1. vue实现部分页面导入底部 vue配置公用头部、底部,可控制显示隐藏

    vue实现部分页面导入底部 vue配置公用头部.底部,可控制显示隐藏 在app.vue文件里引入公共的header 和 footer header 和 footer 默认显示,例如某个页面不需要显示h ...

  2. 浏览器缓存如何控制? && 在url框中回车、F5 和 Ctrl + F5的区别是什么?

    第一部分: 浏览器缓存如何控制?   最近在做网站,但是不知道缓存是什么东西怎么能行! 如何实现HTTP缓存呢? 下面我们来一步一步的探寻实现机制把. 方案一: 无缓存   说明: 浏览器向服务器请求 ...

  3. [Go] 利用有缓存channel控制同时并发的数量

    如果有一个大循环,里面每一个都开启groutine,那么瞬间就会开启非常多的groutine,要解决这个问题就要用channel的阻塞特性来解决 package main import "t ...

  4. HTTPDNS成为移动互联网的标配–原因与原理解析(转)

    DNS,作用就是将域名解析成IP.一个DNS查询,先从本地缓存查找,如果没有或者已经过期,就从DNS服务器查询,如果客户端没有主动设置DNS服务器,一般是从服务商DNS服务器上查找.这就出现了不可控. ...

  5. 网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+

    网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+ HTTPDNS_移动开发_域名解析_域名防劫持-阿里云https://www.aliyun.com/prod ...

  6. PHP flush sleep 输出缓存控制详解

    1 2 3 4 5 6 ob_start,flush,ob_flush for($i=0;$i<</SPAN>10;$i++) { echo $i.''; flush(); slee ...

  7. php如何控制客户端生成缓存

    php如何控制客户端生成缓存 一.总结 一句话总结:用http消息响应头中的Cache-Control来控制客户端缓存,说的是页面本身被客户端缓存,而不是重新生成的其它的非页面缓存 响应头Cache- ...

  8. 网页的缓存Cache与控制

    什么是缓存 Cache? 缓存位于客户端与服务器之间, 或者服务器与服务器之间.它决定是否保存所获资源的副本,以及如何使用副本,何时更新副本,这里所说的资源包括页面的HTML, 图片,文件等等. 使用 ...

  9. 浏览器缓存控制 以及 在url框中回车、F5 和 Ctrl + F5的区别

    第一部分: 浏览器缓存如何控制?   做网站,不知道缓存是什么东西怎么能行! 如何实现HTTP缓存呢? 下面我们来一步一步的探寻实现机制把. 方案一: 无缓存   说明:浏览器向服务器请求资源m.pn ...

随机推荐

  1. Laplace(拉普拉斯)算子

    [摘要] Laplace算子作为边缘检测之一,和Sobel算子一样也是工程数学中常用的一种积分变换,属于空间锐化滤波操作.拉普拉斯算子(Laplace Operator)是n维欧几里德空间中的一个二阶 ...

  2. pytorch 检测图片中是否有人

    照搬pytorch官方代码,只是将数据集换成了INRIAPerson数据集中的train和test文件夹. 贴下代码和效果,代码是官方的,就不详细解释了. # License: BSD # Autho ...

  3. git commit 操作

    查看提交历史 然后在此项目中运行 git log,应该会看到下面的输出:   合并commit 信息 我们需要将 2dfbc7e8 和 c4e858b5 合并成一个 commit,那么我们输入如下命令 ...

  4. php curl 请求api 接口

    官方文档curl : http://www.runoob.com/php/php-ref-curl.html php开启curl :  ① 打开 php.ini 文件  extension=php_c ...

  5. hdu2068 RPG的错排

    RPG的错排 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:16421接受的提交内容:6670 问题描述 ...

  6. 5.监听器(Listener)

    1.监听器简介: 监听器主要用来监听对象的创建,属性的变化,是一个实现特定接口的普通Java类. Listener接口与事件对应表: 与 ServletContext 有关 ServletContex ...

  7. my.变身卡

    中级 1620 (4--6级) 高级 8323 (7--9级) 赤炎: 1.老鼠精 135 / 150 2.白骨精 750 3.情丝娘子 264 / 294 4.沙和尚 500 5.九头虫 1835 ...

  8. VMware Workstation 12.5.9 Pro虚拟机软件中文版

    更新为 VMware Workstation 12.5.9 pro版.VMware虚拟机软件无疑是windows系统下最强大好用的虚拟机软件.最新的VMware Workstation 12 Pro ...

  9. 关于vue路由嵌套遇到的坑~

    关键在于子路由中的path问题,path之前不要放/ <!DOCTYPE html> <html lang="en"> <head> <m ...

  10. g++ -I(大写i) 与-L(大写l)-l(小写l) 的作用与学习

    linux 下 g++编译程序时,-I(大写i) 与-L(大写l)-l(小写l) 的作用 作为一个linux入门级使用者,gcc/g++ 的简单操作已经用过多次, 但是有时稍微复杂一点的程序就会使用到 ...