抛砖引玉——欢迎大家讨论一下HTTP Cache的机制

archu 2011-10-08 10:10:28
最初是由于看到访问CSDN的一个现象,发了个帖子
http://topic.csdn.net/u/20110930/16/eb9653e2-8b7b-457b-b84a-e57287c1badb.html?seed=2070846021&r=75864694

发这个帖子只是希望大家能讨论一下HTTP Cache的机制。

比如你知道页面何时会被缓存在浏览器端?何时缓存在代理服务器上?何时又缓存在HTTP服务器端?
有哪些HTTP头会影响页面的缓存?分别是如何影响的?
什么样的页面可以缓存?什么样的页面不建议缓存?缓存超时时间设多长比较合适?
不同的浏览器,又是如何来处理缓存页面的?比如IE的"检查所存网页较新版本"的各项设置分别是什么含义?


对于Web开发人员来讲,这些基本的知识点如果你能掌握清楚了,能大大改善Web应用的访问速度。
...全文
345 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
on1y_1onely 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 archu 的回复:]

这个200分大家都不想要啊。看到人家100分都说是“超高分”了,没想到200分这么不受欢迎?
[/Quote]

构建高性能web站点 这个本书上都讨论透了.....你先看看
archu 2011-10-13
  • 打赏
  • 举报
回复
这个200分大家都不想要啊。看到人家100分都说是“超高分”了,没想到200分这么不受欢迎?
archu 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qwertxp 的回复:]

是的,不过如何去设置图片的过期时间啊?我们可以设置网页的过期时间,如何设置网页中图片过期时间?
[/Quote]

这个还不简单啊,假设你使用IIS服务,你把过期时间相同的图片都放在同一个子目录里面,然后对这个子目录添加Response Header就可以了。

qwertxp 2011-10-09
  • 打赏
  • 举报
回复
是的,不过如何去设置图片的过期时间啊?我们可以设置网页的过期时间,如何设置网页中图片过期时间?
[Quote=引用 14 楼 archu 的回复:]
引用 9 楼 sp1234 的回复:

引用 6 楼 archu 的回复:
有道理,比如说CSDN首页的logo,就可以长久地缓存


假设它是Web服务器上一个简单的文件,那么无需程序操心,web服务其自己就会支持 Last-Modified 和
If-Modified-Since/304 的机制。

比如你引用图片文件、css和js文件等,都是如此。


不敢完全苟同。……
[/Quote]
archu 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sp1234 的回复:]

引用 6 楼 archu 的回复:
有道理,比如说CSDN首页的logo,就可以长久地缓存


假设它是Web服务器上一个简单的文件,那么无需程序操心,web服务其自己就会支持 Last-Modified 和
If-Modified-Since/304 的机制。

比如你引用图片文件、css和js文件等,都是如此。
[/Quote]

不敢完全苟同。如果某个页面包含了100个图片(以及js,CSS),而这100个图片其实在短时间内都不会有更新的。那么客户端每一次还要发一个If-Modified-Since去跟服务器询问一遍,哪怕不需要重新去下载,这难道不是一种性能的消耗吗?

对于这种我们可以预知在未来某个时间段内不会更新的图片,完全可以设置一个Expires时间,那么客户端只需要直接从本地缓存里面读取数据即可,而不需要发送If-Modified-Since请求到服务器。
qianainan 2011-10-08
  • 打赏
  • 举报
回复
Cache-Control,Expires,Last-Modified
学习
wylp_19 2011-10-08
  • 打赏
  • 举报
回复
我来学习的
风2013 2011-10-08
  • 打赏
  • 举报
回复
cache 这个东西缓存的 一般都不 一段时间内 不刷新无影响的东西
路过的 顶下
机器人 2011-10-08
  • 打赏
  • 举报
回复
Http协议中控制缓存的规则有:Cache-Control, ETag, Expires, Last-Modified。Expires是一种无条件缓存(通过过期时间控制),Last-Modified,ETag是一种有条件缓存(通过数据的标识(时间或者ID)来控制。

如果是无条件缓存客户端浏览器会检查Expires过期时间判断是否发出请求,如果是有条件客户端缓存,则会提交Last-Modified-Since或者ETag供服务端检查是否发生变化,返回304(Not Modified)提示客户端查询的数据没有变化,这需要客户端自己保留缓存。如果是服务端缓存,则返回200(OK)但数据从服务端自己的缓存中读取。另外通常说的缓存策略主要是针对查询即GET操作而言的。
LMAOhuaNL 2011-10-08
  • 打赏
  • 举报
回复
楼上的说的都蛮不错的学习学习
on1y_1onely 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sp1234 的回复:]

引用 6 楼 archu 的回复:
有道理,比如说CSDN首页的logo,就可以长久地缓存


假设它是Web服务器上一个简单的文件,那么无需程序操心,web服务其自己就会支持 Last-Modified 和
If-Modified-Since/304 的机制。

比如你引用图片文件、css和js文件等,都是如此。
[/Quote]

如果无需担心就没有cdn技术了,你这是砸chinacache的饭碗.....
  • 打赏
  • 举报
回复
对于一些Web应用系统来说, 许多频繁更新的页面如果启用浏览器缓存会导致用户看不到最新数据而产生困惑甚至质疑.
所以必要加上这个<meta http-equiv="pragma" content="no-cache" /> 来解决.

如果是其他并不需要即时数据, 又是频繁访问的页面, 浏览器缓存才会发挥它最大的用处. 你可以设置过期时间让浏览器定期更新缓存,来解决数据更新问题.
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 archu 的回复:]
有道理,比如说CSDN首页的logo,就可以长久地缓存
[/Quote]

假设它是Web服务器上一个简单的文件,那么无需程序操心,web服务其自己就会支持 Last-Modified 和
If-Modified-Since/304 的机制。

比如你引用图片文件、css和js文件等,都是如此。
皇城龙三 2011-10-08
  • 打赏
  • 举报
回复
关于浏览器的缓存,很多地方都写得很清楚了,可以去网上百度一下:

下面是个转贴,可以参考一下

浏览器缓存将文件保存在客户端,好的缓存策略可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。因此我们有必要了解它的实现原理,用来提高网站的性能。
当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。页面文件有三种缓存状态。
1.最新的:选择不缓存页面,每次请求时都从服务器获取最新的内容。
2.未过期的:在给定的时间内缓存,如果用户刷新或页面过期则去服务器请求,否则将读取本地的缓存,这样可以提高浏览速度。
3.过期的:也就是陈旧的页面,当请求这个页面时,必须进行重新获取。

页面的缓存状态是由http header决定的,一个浏览器请求信息,一个是服务器响应信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。

Cache-Control的主要参数

Cache-Control: private/public Public 响应会被缓存,并且在多用户间共享。 Private 响应只能够作为私有的缓存,不能再用户间共享。
Cache-Control: no-cache:不进行缓存
Cache-Control: max-age=x:缓存时间 以秒为单位
Cache-Control: must-revalidate:如果页面是过期的 则去服务器进行获取。

Expires:显示的设置页面过期时间
Last-Modified:请求对象最后一次的修改时间 用来判断缓存是否过期 通常由文件的时间信息产生
If-Modified-Since :客户端发送请求附带的信息 指浏览器缓存请求对象的最后修改日期 用来和服务器端的Last-Modified做比较

如IE的设置里面有四种方式(如图)的"每次访问页面检查",用户使用重新加载或超过了过期日期,浏览器就会认为这个页面是陈旧的(它将发送附加一个If - Modified-Since的信息. 如果页面没有改变,服务器端响应一个304状态 Not Modified,而不发送整个页面,这样就会很快,但服务器必须要生成有效的Last-Modified headers且服务器时间必须是有效的。



一个不进行缓存的服务器端响应

HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 19662
Pragma: no-cache
Cache-Control: no-cache
Server: Roxen/2.1.185
Accept-Ranges: bytes
Expires: Wed, 03 Jan 2001 00:18:55 GMT

有时候仅仅设置Pragma: no-cache Cache-Control: no-cache 还是不保险,需要将过期时间设置成过去的时间就确保了对象不被缓存。

一个允许缓存的服务器端响应

HTTP/1.1 200 OK
Date: Tue, 13 Feb 2001 14:50:31 GMT
Server: Apache/1.3.12
Cache-Control: max-age=43200
Expires: Wed, 14 Feb 2001 02:50:31 GMT
Last-Modified: Sun, 03 Dec 2000 23:52:56 GMT
ETag: "1cbf3-dfd-3a2adcd8"
Accept-Ranges: bytes
Content-Length: 3581
Connection: close
Content-Type: text/html

Cache-Control: max-age=43200 表示缓存12个小时

我们来看一个浏览器缓存的具体例子
第一次请求文件
Request:
GET /file.html HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-comet, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: 24.5.203.101
Connection: Keep-Alive

Response:
HTTP/1.1 200 OK
Date: Tue, 13 Feb 2001 20:00:22 GMT
Server: Apache
Cache-Control: max-age=604800
Last-Modified: Wed, 29 Nov 2000 15:28:38 GMT
ETag: "1df-28f1-3a2520a6"
Accept-Ranges: bytes
Content-Length: 10481
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

这里返回了Last-Modified和ETag,这两个信息就是用来以后比较当前浏览器缓存的文件是否和服务器端文件一致,如果不一直就获取最新,一直则读取本地缓存。

第二次请求
Request:
GET /file.html HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 29 Nov 2000 15:28:38 GMT
If-None-Match: "1df-28f1-3a2520a6"
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: 24.5.203.101
Connection: Keep-Alive

Response:
HTTP/1.1 304 Not Modified
Date: Tue, 13 Feb 2001 20:01:07 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
ETag: "1df-28f1-3a2520a6"
Cache-Control: max-age=604800

请求中的If-None-Match信息就是第一次响应的ETag,用来验证和当前响应的ETag是否一致。服务器返回Not Modified,浏览器就读取本地缓存。

我们还可以使用专门缓存服务器来改善性能。他的原理和浏览器的缓存原理一样,所有的浏览器请求将由缓存服务器响应,缓存服务器可以用自己的缓存文件或获取新的文件来响应用户的请求。因此有了缓存服务器的,将大大提高网站的性能。
on1y_1onely 2011-10-08
  • 打赏
  • 举报
回复
http协议与浏览器的实现方式有关系

要是浏览器不支持 写也白写

而http头的具体含义也很简单,直接看协议标准就好了,这个好像不需要讨论.....

http://www.w3.org/Protocols/rfc2616/rfc2616.html

不过指望浏览器缓存还是不太靠谱的,现在大网站一般使用cdn技术......
archu 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feng1366259807 的回复:]
cache 这个东西缓存的 一般都不 一段时间内 不刷新无影响的东西
路过的 顶下
[/Quote]

有道理,比如说CSDN首页的logo,就可以长久地缓存
ZHUKY 2011-10-08
  • 打赏
  • 举报
回复
路过 ...
jmx123456789 2011-10-08
  • 打赏
  • 举报
回复
对于Web开发人员来讲,这些基本的知识点如果你能掌握清楚了,能大大改善Web应用的访问速度。

学习.

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧