本文转自:
http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html
这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助。 本文介绍浏览器和Web服务器之间如何处理"浏览器缓存",以及控制缓存的http header.
缓存的概念
缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。
http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。
http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。
缓存的好处
缓存的好处是显而易见的, 好处有,
1. 减少了冗余的数据传输,节省了网费。
2. 减少了服务器的负担, 大大提高了网站的性能
3. 加快了客户端加载网页的速度
Fiddler可以方便地查看缓存的header
Fiddler中把header都分门别类的放在一起,这样方便查看。
如何判断缓存新鲜度
Web服务器通过2种方式来判断浏览器缓存是否是最新的。
第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。
第二种, 浏览器把缓存文件的ETag, 通过header "If-None-Match", 来告诉Web服务器。
通过最后修改时间, 来判断缓存新鲜度
1. 浏览器客户端想请求一个文档, 首先检查本地缓存,发现存在这个文档的缓存, 获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。
2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。如下图。
3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 如下图。
实例: 打开Fiddler, 然后打开博客园首页。然后F5刷新几次浏览器。 你会看到博客园首页也用了缓存。
与缓存有关的header
我们来看看每个header的具体含义。
Request
Cache-Control: max-age=0 | 以秒为单位 |
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT | 缓存文件的最后修改时间。 |
If-None-Match: "0693f67a67cc1:0" | 缓存文件的Etag值 |
Cache-Control: no-cache | 不使用缓存 |
Pragma: no-cache | 不使用缓存 |
Response
Cache-Control: public | 响应被缓存,并且在多用户间共享, (公有缓存和私有缓存的区别,请看另一节) |
Cache-Control: privat | 响应只能作为私有缓存,不能在用户之间共享 |
Cache-Control:no-cache | 提醒浏览器要从服务器提取文档进行验证 |
Cache-Control:no-store | 绝对禁止缓存(用于机密,敏感文件) |
Cache-Control: max-age=60 | 60秒之后缓存过期(相对时间) |
Date: Mon, 19 Nov 2012 08:39:00 GMT | 当前response发送的时间 |
Expires: Mon, 19 Nov 2012 08:40:01 GMT | 缓存过期的时间(绝对时间) |
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT | 服务器端文件的最后修改时间 |
ETag: "20b1add7ec1cd1:0" | 服务器端文件的Etag值 |
如果同时存在cache-control和Expires怎么办呢?
浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires
ETag
ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。
ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。
为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。
1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。
2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。
3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。
实例, 打开Fiddler, 打开博客园首页。 你可以看到很多图片,或者CSS文件都是用了缓存。 这些都是通过比较ETag的值,来判断文件是否更新了。
浏览器不使用缓存
CTRL+F5强制刷新浏览器,或者设置IE。 可以让浏览器不使用缓存。
1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache. 明确告诉Web服务器,客户端不使用缓存。
2. Web服务器将把最新的文档发送给浏览器客户端.
实例:
打开Fiddler, 打开博客园首页, 然后按CTRL+F5强制刷新浏览器,你将看到
Pragma: no-cache的作用和Cache-Control: no-cache一模一样。 都是不使用缓存。
Pragma: no-cache 是HTTP 1.0中定义的, 所以为了兼容HTTP 1.0. 所以会同时使用Pragma: no-cache和Cache-Control: no-cache
直接使用缓存,不去服务器验证
按F5刷新浏览器和在地址栏里输入网址然后回车。 这两个行为是不一样的。
按F5刷新浏览器, 浏览器会去Web服务器验证缓存。
如果是在地址栏输入网址然后回车,浏览器会"直接使用有效的缓存", 而不会发http request 去服务器验证缓存,这种情况叫做缓存命中,如下图
实例: 比较第一次访问博客园主页和第二次博客园主页
1. 启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。
2. 按CTRL+X将Fiddler中的所有session删除。 关闭firefox,重新打开一个firefox,打开博客园主页。 发现只有30多个session.
分析; 少了的session是因为firefox直接用了缓存,而没有发http request。
如何设置IE不使用缓存
打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。然后保存。
然后点击“删除” 把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。
公有缓存和私有缓存的区别
Cache-Control: public 指可以公有缓存, 可以是数千名用户共享的。
Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。
分享到:
相关推荐
该协议定义了缓存行的四种状态:Modified(M)、Exclusive(E)、Shared(S)和Invalid(I),以确保缓存中的数据是一致的。 MESI协议的缓存状态: * Modified(M):该缓存行有效,数据被修改了,和内存中的数据...
在我们的主题“http.rar_HTTP ppt_HTTP协议_http://brow”中,我们可以深入探讨HTTP协议的特点及其在网页浏览中的作用。 1. 浏览器/服务器模式: HTTP协议采用的是客户端-服务器模型。在这个模型中,客户端(通常...
- **MESI协议(Modified Exclusive Shared Invalid)**:这是最广泛使用的协议之一,它维护四种缓存状态:修改(Modified)、独占(Exclusive)、共享(Shared)和无效(Invalid),并定义了在各种缓存操作下状态...
- 清理无用的缓存:定期清理过期或不再需要的缓存,避免占用过多磁盘空间。 - 缓存命中率:通过合理的缓存策略提高缓存命中率,减少不必要的网络请求。 8. **测试与调试** - 使用HttpCacheTest类进行测试,可以...
在HTTP协议中,缓存主要分为两种类型:强缓存和协商缓存。 ### 2. 强缓存 强缓存依赖于HTTP协议中的两种头字段:`Expires` 和 `Cache-Control`。当浏览器向服务器发送请求时,如果本地有资源的缓存,并且缓存未...
- **实验目的**: 掌握HTTP协议获取网页的过程,了解HTTP请求报文和响应报文的格式,熟悉HTTP1.0与HTTP1.1的区别,验证HTTP缓存的有效性。 - **实验原理**: 使用Wireshark工具抓取网络数据包,分析HTTP协议的交互过程...
MESI协议定义了四个状态来描述缓存行的状态: 1. 修改(M):缓存行有效,数据已被修改,与内存中的数据不一致,仅存在于当前缓存中。当其他处理器尝试访问该数据时,必须先写回主存并变为共享状态(S)。 2. 独享...
3. **HTTP头部**:HTTP协议中的请求和响应都包含头部信息,用于传输额外的信息,例如内容类型、编码方式等。 #### 二、禁止页面缓存的方法 在PHP中,可以通过设置HTTP头部信息来控制浏览器的缓存行为。以下是一些...
9. 缓存机制:HTTP允许客户端缓存资源,通过Cache-Control和ETag等头部字段控制缓存策略,减少不必要的网络传输,提高性能。 10. 版本升级:随着互联网的发展,HTTP协议也在不断演进,如HTTP/1.1、HTTP/2和最新的...
例如,使用分布式锁解决并发问题,使用异步更新避免阻塞主线程,或者采用更高级的缓存一致性协议(如Read-Through/Write-Behind)等。 在面试中,展示对这些问题的深入理解和实践经验,可以体现你对系统架构和性能...
**IIS(Internet Information Services)** 是微软公司提供的一个用于发布Web应用程序的服务器软件,它在Windows操作系统上运行,提供HTTP、HTTPS等网络协议服务。IIS加缓存的实践是为了提升网站性能,减少服务器...
1. Cache-Control:HTTP头中的Cache-Control指令用于控制缓存行为,如"max-age"指定缓存有效时间,"no-cache"要求每次请求都验证缓存是否过期。 2. ETag与If-None-Match:ETag是服务器为每个资源生成的唯一标识,...
综上所述,页面的缓存与不缓存设置是通过HTTP协议头和HTML的`meta`标签来实现的,这涉及到多个层次的缓存策略,包括浏览器、中间缓存服务器和Web服务器。理解并正确运用这些设置,对于提高网站性能和用户体验至关...
HTTP协议是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。在HTTP中,缓存控制是优化网络性能的重要机制,它允许客户端(如浏览器)存储服务器响应,并在后续请求时利用...
HTTP 协议提供了缓存控制头,如 `Cache-Control`、`ETag` 和 `Last-Modified`,用于管理缓存的有效性和更新。 2. **数据库缓存**:例如 MySQL 的 InnoDB 缓存、Redis 或 Memcached,它们存储数据库查询结果,避免...
#### 四、缓存管理器的使用者 缓存管理器被广泛应用于多种场景中,包括但不限于: 1. **磁盘文件系统**:如NTFS、FAT、CDFS、UDFS等。 2. **Windows文件服务器**:为网络用户提供文件共享服务。 3. **Windows...
四、capr协议的实际应用 capr协议在实际应用中,可能用于以下场景: 1. **实时交易系统**:在高频交易中,capr可以帮助快速处理和分析大量交易数据,提高交易决策的速度。 2. **数据回放与模拟**:通过capr协议...
- HTTPS:HTTP与SSL/TLS的结合,提供了数据加密、服务器身份验证、消息完整性检查,确保通信安全。 7. **首部字段**: - 常见的有Content-Type定义数据类型,Authorization进行身份验证,Cookie和Set-Cookie管理...
3. **缓存一致性**:多副本环境下,如何保证所有缓存节点的数据一致性,例如使用MESI协议来维护CPU缓存的一致性。 **缓存的挑战** 1. **缓存污染**:非热点数据占据了缓存空间,导致真正需要的热点数据无法有效...