引言

  通过网络获取内容既缓慢,成本又高。大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本。因此,缓存和重用以前获取到的资源的能力成为性能优化的一个很关键的方面。

与缓存相关的HTTP首部字段主要有哪些

  (1)通用首部字段(意味着既能用于请求报文,又能用于响应报文)

字段名称 说明
Cache-Control 控制缓存的行为
Pragma http1.0的遗留物,值为"no-cache"时禁用缓存

  (2)请求首部字段

  (3)响应首部字段

  (4)实体首部字段

这些HTTP首部字段之间的联系和区别

  Pargram:设置no-cache禁用cache

  Expires:通过时间来控制来告诉浏览器资源缓存过期时间,如果还没过期就不发送请求。

HTTP缓存首部字段的优先级

  优先级:Pragram>Cache Control>Expires

HTTP缓存首部字段的特点和局限性

  上述的首部字段均能让客户端决定是否向服务器发送请求。为了让客户端与服务器之间更有效的利用缓存,HTTP1.1新增了几个首部字段来做这件事情。

  (1)Last-Modified

    服务器将资源传递给客户端时,会将资源最后更改的时间以"Last-Modified:GMT"的形式加载实体首部一起返回给客户端。    客户端会为资源标记上该信息,再进行下一次请求的时候,会将"Last-Modified:GMT"这个信息添加到请求中,服务器做检查,如果资源没有被修改过(这个地方自己体会),那么返回304状态码,如果资源修改过,就返回200状态码。

  (2)ETag

    为了解决"Last-Modified:GMT"可能存在不准确的问题,HTTP1.1还推出了ETag字段。服务器会通过某种算法,给资源加上一个唯一的标识符,把资源返回给客户端时,会在实体首部加上"ETag:标识符"一起返回给客户端,客户端会保留该资源的ETag字段。   当然,客户端再请求时,会将这个ETag带上,服务器只需比较一下ETag是否跟服务器上的一致(除非服务器上的资源发生了更新,否则服务器上该资源的ETag是不会变的)。

用户在不同的页面刷新行为的差别

  可以讲用户刷新访问界面的手段分为三类:

  (1)在浏览器地址栏输入地址

  (2)F5   、点击浏览器工具栏中的刷新按钮    、右键选择重新加载

  (3)Ctl+F5

  不同的手段网页加载速度是不一样的。他们之间的区别何在呢?假设,浏览器对一个地址没有进行任何的访问,更没有缓存文件。准备工作,地址栏输入网址,首次访问该网页,查看请求与响应信息可以看到请求头部没有任何关于http缓存相关的信息,响应的头部却包含了:

  Cache-Control:max-age=31104000

  Expires:Thu,20 Jul 2017 02:18:41  GMT

  Last-Modified:Fri,15 Jul 2016 04:11:51 GMT

这个时候,浏览器会对这些信息进行缓存,直至该文件过期、用户清空Cache或者用户强制资源刷新。

  准备工作完成后,就该比较三者间的区别:

  (1)输入地址   浏览器发现该资源已经缓存切没有过期(通过Cache-Control或者Expires头部),没有跟服务器确认,直接使用了了浏览器的缓存。

  (2)F5会让浏览器无论如何都发送一个HTTP请求给服务器,但是他的头部会加上浏览器缓存的Last-Modified,服务器判断后,发现没有过期,所以就返回了一个304状态码。这个信息很小,所以页面很快就刷新了。

  (3)Ctl+F5是彻底从服务器要一分资源过来。

实践中应该使用哪些报文头来控制缓存

  大多数首部字段还是有用的。

  虽然不是很懂,但是不明觉厉,实践者就会明白!

最新文章

  1. IIS6与IIS7中如何设置文件过期
  2. Invalid byte 3 of 3-byte UTF-8 sequence
  3. Java为什么只能单继承?
  4. 省常中模拟 Test3 Day1
  5. CentOS6.5解压缩文件.tar.gz .war .zip
  6. GO开发[四]:golang函数
  7. mysql导入导出数据
  8. 【NOIP2013货车运输】
  9. 学习 JavaScript(二)在 HTML 中使用 JS
  10. dubbo不完全指南
  11. Python-认识正则表达式-53
  12. jmeter(五)几种不同的content-type方式
  13. mysql从库Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'报错处理
  14. What are the differences between Flyweight and Object Pool patterns?
  15. linux 断网 扫描基本命令
  16. python学习 day7 (3月8日)
  17. UI Recorder 安装教程(一)
  18. ASP.net 控件实现数据级联
  19. python中交换两个值的方法
  20. How to create VO s and VLs dynamically in OAF

热门文章

  1. postgres-xl 集体搭建
  2. MySQL SQL优化——分片搜索
  3. LA2965 n个数中选出最多个数异或和为0
  4. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)
  5. linux的学习系列 1---简介
  6. curl file_get_contents fsockopen
  7. iOS 常用代码块
  8. AI 人工智能 探索 (四)
  9. UVALive 2517 Moving Object Recognition(模拟)
  10. FZU 1912 Divisibility by Thirty-six(整除问题+字符串维护+贪心)