浏览器以及对应的客户端缓存

通过这张图,我们晓得缓存分为以下几部分,客户端缓存,CDN缓存,反向代理缓存以及对应的本地缓存,分布式缓存等

前面我有介绍过 CND缓存 和 反向代理缓存,今天我们主要介绍一下浏览器缓存以及对应的本地缓存

1:客户端缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问,想想现在的大型网站,随便一个页面都是一两百个请求,每天 pv 都是亿级别,如果没有缓存,用户体验会急剧下降、同时服务器压力和网络带宽都面临严重的考验。

2:客户端缓存主要是HTTP协议定义的缓存机制(如 Expires, Cache-Control字段), 也有非HTTP协议定义的缓存,使用HTTP-MATE标签,如:<META HTTP-EQUIV="Pragma" CONTENT="no-cache">这个代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。

3:HTTP第一次请求的过程一般为:浏览器发送一个请求给服务器--->服务器接收请求并且处理然后回发响应-->浏览器根据响应展示数据。他们之间传输的格式都是以Http协议为主。下图就是整个请求响应的基本流程图:

4:根据3得知,客户端缓存不缓存一般是根据服务器端响应的信息来决定,一般都出现在HttpResponse.Head里面,以京东为例子:

web服务器返回的Cache-Control头的值为max-age=300,即5分钟,之前我们有看到过Expires,这个是浏览器1.0时出现的,现在一般都是1.1,所以都是使用cache-control来设置,它们都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。

5:HTTP-Header中的Cache-Control字段列举如public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age,下面列举了每个的具体用法:

  • public指示响应可被任何缓存区缓存。
  • private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
  • no-cache指示请求或响应消息不能缓存
  • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
  • max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  • min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
  • max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

6:浏览器再次请求一般流程如下图:

通过上图,我们发现了Etag/If-None-Match/If-Modified-Since等词,其实这些词都需配合Cache-Control使用的字段,下面将具体介绍一下:
A:Last-Modified/If-Modified-Since,Last-Modified/If-Modified-Since要配合Cache-Control使用。

Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。

If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。

B:Etag/If-None-Match ,Etag/If-None-Match也要配合Cache-Control使用。

Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。

C:既生Last-Modified何生Etag?
你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  • Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
  • 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
  • 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
  • Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

原文地址:https://www.cnblogs.com/loverwangshan/p/10655732.html

时间: 2024-08-26 08:32:16

浏览器以及对应的客户端缓存的相关文章

Cookie客户端缓存.Session.Application

Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器的请求次数,从而减少用户等待从服务端获取数据的时间. 二是网络状态不佳时仍可以显示离线数据. 2.本地存储 用chrome浏览器打开一个网页,F12进入开发者模式,点击Application,我们可以看到: 以上的Local Stroage . Session Stroag

客户端缓存(Client Cache)

通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存时间都是短暂的,所以最好是自定义延长浏览器缓存. 这个时候就需要修改Http头信息了,头信息中有个字段: Cache-Control:no-cache 有很多办法可以修改头字段,比较方便通用的就是在web.config里设置,例如: <?xml version="1.0"?>

ASP.NET 客户端缓存(Client Cache)

通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存时间都是短暂的,所以最好是自定义延长浏览器缓存. 这个时候就需要修改Http头信息了,头信息中有个字段: Cache-Control:no-cache 有很多办法可以修改头字段,比较方便通用的就是在web.config里设置,例如: <?xml version="1.0"?> 

php控制客户端缓存

1.关于HTTP消息 详见: http://www.runoob.com/http/http-messages.html http消息中请求头是浏览器要告诉服务器的信息,而响应头是服务器要告诉客户端的信息.这些头的定义是HTTP协议定义好的,客户端和服务器通过解析消息头中信息来完成各自的工作.比如:请求头中Accept-Language:zh-CN,zh;q=0.8 告诉服务器客户端能接收的语言. 2.响应头Cache-Control控制缓存 Cache-Control 一个用于定义缓存指令的通

nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存

一.Nginx优化目的 标准情况下,软件默认的参数都是对安装软件的硬件标准来设置的,目前我们服务?的硬件资源远远大于要求的标准,所以为了让服务?性能更加出众,充分利用服务?的硬件资源,我们一般需要优化APP的并发数来提升服务器?的性能. 二.工作进程优化 1) worker_processes worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_pro

浏览器因编码引起的缓存问题

测试 mysql_query  与 mysql_unbuffered_query的时间差问题的时候,做了一个简单的PHP连接mysql数据库的测试代码,文件编码是utf8,在chrome浏览器中,当把chrome浏览器的编码更改为utf8的情况下,刷新页面,获取的时间戳是不会改变的,在nginx服务器和代码之间找了很久也没发现问题,换成IE浏览器结果是好的.当使用chrome浏览器的编码浏览器默认打开的编码(页面的中文是乱码),则时间戳是会改变的.在PHP代码页面加上页面的编码,问题迎刃而解 p

Apache服务器设置mod_expires客户端缓存

配置httpd.conf文件 去掉#  加载LoadModule expires_module modules/mod_expires.so模块 加上如下配置: ExpiresActive On ExpiresDefault "access plus 300 seconds" <Directory "D:\apache-tomcat-7.0.35\webapps\ROOT"> Options FollowSymLinks MultiViews Allow

asp.net 服务器端缓存与客户端缓存 [转]

介绍: 在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理.每个人都会用不同的方法去解决如何在IE在管理数据.有的会提到用状态管 理,有的提到的cache管理,这里我比较喜欢cache管理,因为本人比较喜“cache”这个词.但是状态管理和cache管理这两个在概念和意义上 是不同的,下面就让我们来讨论下两都在各个方面的不同之处. 虽然cache管理并不存在于Windows程序,但在web环境中已经得到巨大的应用.自从HTTP变成无协议以来,在WEB上要想分辨两个不同请求变

Android客户端缓存机制(文字缓存跟多媒体文件缓存)

Android客户端缓存机制(文字缓存和多媒体文件缓存) 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 缓存文件保存策略: 1.       文字缓存: 文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域. 根据两者的更新频率区分它们的过期时间. 更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到