博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTTP缓存应用
阅读量:6185 次
发布时间:2019-06-21

本文共 1472 字,大约阅读时间需要 4 分钟。

缓存主要解决的问题

  • 冗余的数据传输
  • 带宽瓶颈
  • 瞬间拥塞
  • 距离时延

缓存的分类

1、强缓存

强制缓存如果生效,不需要再和服务器发生交互,而弱缓存(协商缓存,对比缓存)不管是否生效,都需要与服务端发生交互

Cache-Control(HTTP1.1,相对值)/Expires(HTTP1.0,绝对值)

Expires是HTTP/1.0的产物 ,设置它主要是为了向下兼容

// http response    Cache-Control: max-age=600 // 单位是秒    Expires: Mon, 18 Jun 2018 13:37:33 GMT // 格林乔治时间,在这个时间之后过期复制代码

2、弱缓存/协商缓存/对比缓存

对比缓存,顾名思义,需要进行比较判断是否可以使用缓存。 浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。 再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。

Last-Modified/If-Modified-Since:Last-Modified是标识文件在服务器上的最近更新时间。下次请求时,如果文件缓存过期,浏览器通过If-Modified-Since字段带上这个时间,发送给服务器,由服务器比较时间戳来判断文件是否有修改。如果没有修改,服务器返回304告诉浏览器继续使用缓存;如果有修改,则返回200,同时返回最新的文件。

// http response header:    Last-Modified:Mon, 07 Nov 2016 07:51:11 GMT    // http request header:    If-Modified-Since:Mon, 07 Nov 2016 07:51:11 GMT复制代码

Etag:ETag的值为服务器对请求的资源的内容按照hash算法计算的一个值,当内容发生改变的时候,这个值会相应的改变。

一些资源文件会周期性的更改,但是内容并不会变,仅仅只改变了其修改时间,这个时候我们并不希望客户端每次都从服务器获取新鲜的资源,而Etag的计算则会保持一致;
某些文件修改非常频繁,GMT时间单位只能精确到秒级,这种文件的验证会出现问题;
某些服务器对文件的计算时间不够精确,存在偏差;

// http response header:ETag: 16e36-540b1498e39c0// http request header:If-None-Match: 16e36-540b1498e39c0复制代码

整体控制缓存是否开启:

Pragma: no-cache  //请求头中去掉If-Modified-Since和If-None-Match。复制代码

如何刷新浏览器是最好的?

windows下Ctrl(Mac OS下的command) + R或者F5,即为正常的刷新行为,强缓存和协商缓存都会去验证。 Ctrl + shift + R或者Ctrl + F5或者在devtool的Network中disable cache都会在请求首部加上Cache-Control: no-cache和Pragma: no-cache首部,并且清除掉Etag和Last-Modified首部,从而达到硬性重新加载的效果,即跳过缓存验证。 最后一项则会在上一项的基础上把在内存或者磁盘的缓存全部给清除掉。

转载地址:http://xwpda.baihongyu.com/

你可能感兴趣的文章
[转载] 谈面试
查看>>
The difference between Severity and Priority
查看>>
js里实现给数字加三位一逗号间隔的两种方法
查看>>
DOS命令大全(经典收藏)
查看>>
Android数字选择器-NumberPicker
查看>>
zoj 3547 The Boss on Mars 第36届ACM大连预选赛I题
查看>>
javascript基础
查看>>
一套简约漂亮的响应式博客园主题皮肤
查看>>
java http post/get 服务端和客户端实现json传输
查看>>
ABP之本地化/多语言支持
查看>>
小学生四则运算应用软件(二)
查看>>
鸵鸟心态
查看>>
POJ-魔兽世界之一:备战
查看>>
第二章 逻辑代数及其简化
查看>>
重写Euqals & HashCode
查看>>
用AJAX+ASP实现的两级联动下拉菜单
查看>>
iOS开发之状态栏UIStatusBar图标操作
查看>>
Django---部署
查看>>
node的模板:Handlebars
查看>>
iPad开发--QQ空间布局,登录模块
查看>>