HTTP缓存

摘要:
本文是“HTTP权威指南”Reading Notes Web Cache是一种可以自动保存常见文档副本的设备。缓存可以在任何时间、任何频率重新验证副本:HTTP为我们提供了几种工具来重新验证缓存对象,但最常用的是If Modified Since标头。HTTP允许原始服务器将到期日期附加到每个文档。HTTP/1.0+中Expires的第一个描述是绝对过期日期,HTTP/1.1中Cache Control的第一个说明是相对过期日期(例如5000秒)。

本文是《HTTP权威指南》读书笔记


Web缓存是可以自动保存常见文档副本的设备。当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档。使用缓存可以有以下优点:

  • 缓存节省了冗余的数据的传输,节省了网络费用;
  • 缓解了网络瓶颈问题,不需要更多的带宽就可以更快地加载页面;
  • 缓存降低了对原始服务器的要求, 让服务器可以快速的响应,避免过载出现;
  • 缓存降低了距离时延;

但缓存不能保存世界上每一份文档的副本,因此会出现两种情况:可以用已有副本为某些到达缓存的请求提供服务,这叫缓存命中,其他一些到达缓存的请求可能会由于没有副本可用,而被转发给原始的服务器,这叫缓存未命中。并且缓存可以在任意时刻经任意的频率对副本进行再验证(看看副本有没有变化):

HTTP缓存第1张

HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的为If-Modified-Since首部。将这个首部添加到GET请求中去,告诉服务器只有在缓存了对象之后,更改了这个对象的内容时,才发送对象。服务器在收到这个GET If-Modified-Since后,会发生以下三种情况的一种:

  1. 服务器上的对象内容没有更改;
  2. 服务器上的对象内容更改了;
  3. 服务器上的对象删除了;

服务器会针对具体的情况作出响应:

  • 再验证命中,服务器对象内容未更改,服务器会向客户端发送一个小的HTTP 304 NOt  MOdified响应;
  • 再验证未命中,如果服务器对象内容更改了,服务器会向客户端发送一条普通的、带有完整内容的HTTP 200 OK响应;
  • 对象被删除了,如果对象被删除了,则服务器会返回一个404 Not Found响应,缓存也会将副本删除;

HTTP缓存第2张

缓存又可分为私有缓存和公有缓存,比如浏览器一般会将常用文档缓存在我们的电脑中,这是私有缓存;而公有缓存接受多个用户的访问,所以一般是一个共享代理服务器或叫代理缓存,如:

HTTP缓存第3张

一般来说对一条HTTP GET报文的基本缓存处理的过程如下:

  1. 接收,缓存从网络中读取抵达的请求报文;
  2. 解析,缓存对报文进行解析,提取出URL和各种首部;
  3. 查询,缓存查看是否有本地副本可用,如果没有,就从服务器里获取一个副本,并保存在本地;
  4. 新鲜度检测,缓存查看已缓存的副本是否足够新鲜,若不是,则向服务器询问是否有任何的更新;
  5. 创建响应,缓存会用新的首部和已缓存的主体来构建一条响应;
  6. 发送,缓存通过网络将响应发送给客户端;
  7. 日志,缓存可选地创建一条日志来描述这个事务;

HTTP缓存第4张

那我们怎样知道缓存的副本是否过期了呢?HTTP让原始服务器给每个文档附加了一个过期日期,HTTP/1.0+ 的Expires首部描述是绝对过期日期(就是具体的日期,如2015.09.22),HTTP/1.1的 Cache-Control首部描述是相对过期日期(如5000秒

。在缓存的副本过期之前,可以任意频率使用这些文档,而不用向服务器验证

HTTP缓存第5张

当缓存的副本过期后,就需要向服务器验证这些缓存的副本的正确性,一般是使用HTTP的条件请求,常用的条件请求的首部有:

HTTP缓存第6张

控制缓存的能力

服务器可以在响应中添加缓存控制首部来控制缓存存活的时间,按优先级的顺序依次为:

  • 附加一个Cache-Control:no-store 首部;可以缓存文档,但每次使用前需要向服务器验证新鲜度
  • 附加一个Cache-Control:no-cache首部;
  • 附加一个Cache-Control:must-revalidate;
  • 附加一个Cache-Control:max-age;
  • 附加一个Expires首部;
  • 不附加过期信息,让缓存自己决定文档的过期时间;

免责声明:文章转载自《HTTP缓存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高起播低延时RTSP网页无插件流媒体播放器EasyPlayerRTSP插件使用说明如何扩展ArcGIS中的元数据编辑器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

服务器上Ubuntu系统安装

https://www.cnblogs.com/2012-dream/p/11457357.html 自己之前没有摸过服务器,就是实体的那种,远程连接的不算。才发现,服务器也是电脑主机的形状,只是更大一号,然后服务器有自己的配套输入输出设备,显示屏和键盘触摸板,外观看起来跟笔记本类似,不过后面有接口,用于连接不同的服务器主机,所以多个服务器都是共享同一套输...

一文带你了解 HTTP 黑科技

这是 HTTP 系列的第三篇文章,此篇文章为 HTTP 的进阶文章。 在前面两篇文章中我们讲述了 HTTP 的入门,HTTP 所有常用标头的概述,这篇文章我们来聊一下 HTTP 的一些 黑科技。 HTTP 内容协商 什么是内容协商 在 HTTP 中,内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制。内容协商机制是指客户端和服务器端就响应的资...

Nginx作为静态web服务器——缓存原理

浏览器缓存 ​ 客户端无缓存的情况下 ​ 客户端有缓存的情况下 ​ 校验过期机制 ​ 本地客户端会检查Cache-Control(max-age)缓存是否过期,(max-age)为过期时间 Last-Modified 上次修改时间 配合If-Modified-Since或者If-Unmodified-Since使用 对比上次修改时间验证资源是否需要更...

在发布ASP.NET网站的时候,出现state server错误

错误信息如下: 在发布ASP.NET网站的时候,出现state server错误: Server Error in '/' Application. -------------------------------------------------------------------------------- Unable to make the...

【Web技术】276- WebView缓存原理分析和应用

前言 混合式开发,在产品体验以及页面加载速度的体验上已经非比以往的。今日早读文章由@unclechen分享。 正文从这开始~ 一、背景 现在的App开发,或多或少都会用到Hybrid模式,到了WebView这边,经常会加载一些js文件(例如和WebView用来Native通信的bridge.js),而这些js文件不会经常发生变化,所以我们希望js在Web...

C#编程中关于数据缓存的经验总结

C#编程中关于数据缓存的经验总结一直以来,我都发现程序的运行速度不够理想。通过查代码,发现程序对数据库的访问非常频繁,而且检索出来的数据量比较大。为了让程序运行快起来,我想对程序采用适当的缓存方法。我在C#尝试了5种方法进行数据缓存,具体如下:(如有遗漏,错误欢迎大家指正,欢迎提建议。)1:Session方法:此方法是针对于每个用户来的,如果用户量比较大,...