HTTP缓存
本文是《HTTP权威指南》读书笔记
Web缓存是可以自动保存常见文档副本的设备。当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档。使用缓存可以有以下优点:
- 缓存节省了冗余的数据的传输,节省了网络费用;
- 缓解了网络瓶颈问题,不需要更多的带宽就可以更快地加载页面;
- 缓存降低了对原始服务器的要求, 让服务器可以快速的响应,避免过载出现;
- 缓存降低了距离时延;
但缓存不能保存世界上每一份文档的副本,因此会出现两种情况:可以用已有副本为某些到达缓存的请求提供服务,这叫缓存命中,其他一些到达缓存的请求可能会由于没有副本可用,而被转发给原始的服务器,这叫缓存未命中。并且缓存可以在任意时刻经任意的频率对副本进行再验证(看看副本有没有变化):
HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的为If-Modified-Since首部。将这个首部添加到GET请求中去,告诉服务器只有在缓存了对象之后,更改了这个对象的内容时,才发送对象。服务器在收到这个GET If-Modified-Since后,会发生以下三种情况的一种:
- 服务器上的对象内容没有更改;
- 服务器上的对象内容更改了;
- 服务器上的对象删除了;
服务器会针对具体的情况作出响应:
- 再验证命中,服务器对象内容未更改,服务器会向客户端发送一个小的HTTP 304 NOt MOdified响应;
- 再验证未命中,如果服务器对象内容更改了,服务器会向客户端发送一条普通的、带有完整内容的HTTP 200 OK响应;
- 对象被删除了,如果对象被删除了,则服务器会返回一个404 Not Found响应,缓存也会将副本删除;
缓存又可分为私有缓存和公有缓存,比如浏览器一般会将常用文档缓存在我们的电脑中,这是私有缓存;而公有缓存接受多个用户的访问,所以一般是一个共享代理服务器或叫代理缓存,如:
一般来说对一条HTTP GET报文的基本缓存处理的过程如下:
- 接收,缓存从网络中读取抵达的请求报文;
- 解析,缓存对报文进行解析,提取出URL和各种首部;
- 查询,缓存查看是否有本地副本可用,如果没有,就从服务器里获取一个副本,并保存在本地;
- 新鲜度检测,缓存查看已缓存的副本是否足够新鲜,若不是,则向服务器询问是否有任何的更新;
- 创建响应,缓存会用新的首部和已缓存的主体来构建一条响应;
- 发送,缓存通过网络将响应发送给客户端;
- 日志,缓存可选地创建一条日志来描述这个事务;
那我们怎样知道缓存的副本是否过期了呢?HTTP让原始服务器给每个文档附加了一个过期日期,HTTP/1.0+ 的Expires首部描述是绝对过期日期(就是具体的日期,如2015.09.22),HTTP/1.1的 Cache-Control首部描述是相对过期日期(如5000秒
。在缓存的副本过期之前,可以任意频率使用这些文档,而不用向服务器验证
当缓存的副本过期后,就需要向服务器验证这些缓存的副本的正确性,一般是使用HTTP的条件请求,常用的条件请求的首部有:
控制缓存的能力
服务器可以在响应中添加缓存控制首部来控制缓存存活的时间,按优先级的顺序依次为:
- 附加一个Cache-Control:no-store 首部;可以缓存文档,但每次使用前需要向服务器验证新鲜度
- 附加一个Cache-Control:no-cache首部;
- 附加一个Cache-Control:must-revalidate;
- 附加一个Cache-Control:max-age;
- 附加一个Expires首部;
- 不附加过期信息,让缓存自己决定文档的过期时间;
HTTP缓存的更多相关文章
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- ASP.NET Core 中间件之压缩、缓存
前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 深究标准IO的缓存
前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...
- 缓存工厂之Redis缓存
这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
随机推荐
- 琴弦文字 - wpf行为
效果图: 此效果的设计和实现思路均来自:上位者的怜悯 详情见原文:http://www.cnblogs.com/lianmin/p/5940637.html 我所做的,只是将原作者的设计和思路封装成了 ...
- [Membership架构分析1] ASP.NET membership的表结构
转自:http://blog.sina.com.cn/s/blog_650b9ecc0100iqfo.html 1)表名:aspnet_Applications 说明:保存应用程序信息(系统名) 每一 ...
- uva10635 LIS
Prince and PrincessInput: Standard Input Output: Standard Output Time Limit: 3 Seconds In an n x n c ...
- bzoj1500
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 12544 Solved: 3970[Submit][Statu ...
- java面向对象---对象容器
泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...
- UOJ58 【WC2013】糖果公园
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 如果mac电脑的usb转接器连接wlan时不显示,也就是不识别usb此时的网络连接没有,解决办法就是如下
1.接上电源 关机 先按下shift +ctrl + opt + 开机键 ,等待10秒,这10秒是没有反应的,屏幕不会亮,系统不会跑起来, 10秒之后松开所有键,再按下opt + cmd ...
- centos7的使用
在虚拟机vmware 中如果打算安装vmware tools增强工具的话! 可 以先在mnt目录下创建一个文件夹,mkdir /mnt/cdrom,然后通过mount /dev/cdrom /mnt/ ...
- SpringMVC前后端数据交互总结
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
- JS中SetTimeOut和SetInterval方法的区别?
1.setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 ...