写给后端程序员的HTTP缓存原理介绍

news/2024/7/7 11:17:42 标签: 后端

通过Internet获取资源既缓慢,成本又高。为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存和重用以前获取的资源,从而优化性能,提升体验。虽然Http中关于缓存控制的部分,随着协议演进,有一些变化。但我觉着,作为后端程序员, 在开发Web服务时,只需要关注请求头If-None-Match、响应头ETag、响应头Cache-Control就足够了。因为这三个Http头就 可以满足你的需求,并且,当今绝大多数的浏览器,都支持这三个Http头。我们所要做的就是,确保每个服务器响应都提供正确的 HTTP 头指令,以指导浏览器何时可以缓存响应以及可以缓存多久。

缓存在哪儿?

HttpCache

上图中有三个角色,浏览器、Web代理和服务器,如图所示Http缓存存在于浏览器和Web代理中。当然在服务器内部,也存在着各种缓存,但这已经 不是本文要讨论的Http缓存了。所谓的Http缓存控制,就是一种约定,通过设置不同的响应头Cache-Control来控制浏览器和Web代理对缓 存的使用策略,通过设置请求头If-None-Match和响应头ETag,来对缓存的有效性进行验证。

响应头ETag

ETag全称Entity Tag,用来标识一个资源。在具体的实现中,ETag可以是资源的hash值,也可以是一个内部维护的版本号。但不管怎样,ETag应该能反映出资源内容的变化,这是Http缓存可以正常工作的基础。

HttpCacheEtag

如上例中所展示的,服务器在返回响应时,通常会在Http头中包含一些关于响应的元数据信息,其中,ETag就是其中一个,本例中返回了值为x1323ddx的ETag。当资源/file的内容发生变化时,服务器应当返回不同的ETag。

请求头If-None-Match

对于同一个资源,比如上一例中的/file,在进行了一次请求之后,浏览器就已经有了/file的一个版本的内容,和这个版本的ETag,当下次用 户再需要这个资源,浏览器再次向服务器请求的时候,可以利用请求头If-None-Match来告诉服务器自己已经有个ETag为x1323ddx的 /file,这样,如果服务器上的/file没有变化,也就是说服务器上的/file的ETag也是x1323ddx的话,服务器就不会再返回/file 的内容,而是返回一个304的响应,告诉浏览器该资源没有变化,缓存有效。

HttpCache

如上例中所示,在使用了If-None-Match之后,服务器只需要很小的响应就可以达到相同的结果,从而优化了性能。

响应头Cache-Control

每个资源都可以通过Http头Cache-Control来定义自己的缓存策略,Cache-Control控制谁在什么条件下可以缓存响应以及可 以缓存多久。 最快的请求是不必与服务器进行通信的请求:通过响应的本地副本,我们可以避免所有的网络延迟以及数据传输的数据成本。为此,HTTP 规范允许服务器返回一系列不同的 Cache-Control 指令,控制浏览器或者其他中继缓存如何缓存某个响应以及缓存多长时间。

Cache-Control 头在 HTTP/1.1 规范中定义,取代了之前用来定义响应缓存策略的头(例如 Expires)。当前的所有浏览器都支持 Cache-Control,因此,使用它就够了。

以下我来介绍可以再Cache-Control中设置的常用指令。

max-age

该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒。例如:Cache-Control:max-age=60表示响应可以再缓 存和重用 60 秒。需要注意的是,在max-age指定的时间之内,浏览器不会向服务器发送任何请求,包括验证缓存是否有效的请求,也就是说,如果在这段时间之内,服务 器上的资源发生了变化,那么浏览器将不能得到通知,而使用老版本的资源。所以在设置缓存时间的长度时,需要慎重。

public和private

如果设置了public,表示该响应可以再浏览器或者任何中继的Web代理中缓存,public是默认值,即Cache-Control:max-age=60等同于Cache-Control:public, max-age=60。

在服务器设置了private比如Cache-Control:private, max-age=60的情况下,表示只有用户的浏览器可以缓存private响应,不允许任何中继Web代理对其进行缓存 – 例如,用户浏览器可以缓存包含用户私人信息的 HTML 网页,但是 CDN 不能缓存。

no-cache

如果服务器在响应中设置了no-cache即Cache-Control:no-cache,那么浏览器在使用缓存的资源之前,必须先与服务器确认 返回的响应是否被更改,如果资源未被更改,可以避免下载。这个验证之前的响应是否被修改,就是通过上面介绍的请求头If-None-match和响应头 ETag来实现的。

需要注意的是,no-cache这个名字有一点误导。设置了no-cache之后,并不是说浏览器就不再缓存数据,只是浏 览器在使用缓存数据时,需要先确认一下数据是否还跟服务器保持一致。如果设置了no-cache,而ETag的实现没有反应出资源的变化,那就会导致浏览 器的缓存数据一直得不到更新的情况。

no-store

如果服务器在响应中设置了no-store即Cache-Control:no-store,那么浏览器和任何中继的Web代理,都不会存储这次相应的数据。当下次请求该资源时,浏览器只能重新请求服务器,重新从服务器读取资源。

怎样决定一个资源的Cache-Control策略呢?

下面这个流程图,可以帮到你。

HttpCache



来源:51CTO


http://www.niftyadmin.cn/n/711885.html

相关文章

SpringMVC——框架概述第一个注解的SpringMVC程序

文章目录: 1.SpringMVC框架的基本说明 2.第一个注解的SpringMVC程序 2.1 IDEA中使用maven创建一个web项目 2.2 在pom.xml中加入相关依赖 2.3 在web.xml中声明DispatcherServlet对象 2.4 创建一个发起请求的jsp页面(index.jsp) 2.5 创建…

PHP多次调用Mysql存储过程报错解决办法

PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适合我们的项目,我们使用CI框架写…

8小时用html5打造vncviewer,安装VNC Server实现图形化访问的小技巧

安装VNCServer实现图形化访问的小技巧,许多人看到这个问题的时候,都觉得头很大,不知道如何下手,而且在操作过程中,总会犯一些这样那样的错误,下面卖贝商城的小编就具体介绍一下,不是很难哦!一. …

mysql集群场景_MYSQL集群的搭建

三台服务器实现主主从搭建:第一台服务器ip:192.168.1.106第二台服务器ip:192.168.1.195第三台服务器ip:192.168.1.150mysql主从的应用场景:数据分布 负载均衡 高可用和容错 备份现在三台服务器都安装mysql开发环境 主从系统要一致 mysql版本和io磁盘开始搭建:首先得先建立一个复…

90 《阿里巴巴 java开发手册》关于MySQL的规约(建表规约)

建表规约 【强制】 1、表达是与否的概念的字段,必须使用 is_xxx 的方式来命名,数据类型是 unsigned tinyint (1表示是,0表示否)。 说明:任何字段如果为非负数,则必须是 unsigned 。 注意&…

怎样将ppt转换成pdf

为什么80%的码农都做不了架构师?>>> 怎样将ppt转换成pdf 最近朋友遇到了件麻烦事,公司领导让他将去年每个月编写的的仓库货物文件整理出来,制定要转成PDF格式文件,而大部分的文件都是PPT格式的,如何实现PPT…

实施微服务架构的关键技术

大家都在提微服务架构,微服务架构到底是什么?它有哪些特点和设计模式?我们在打造微服务架构过程中,这些设计模式在实战当中如何应用?数据的一致性应该如何保证?今天我将针对上述疑问分享一下我的思考。 微服…

SpringMVC——@RequestMapping定义请求规则,控制器接收请求参数的三种方式

文章目录: 1.RequestMapping定义请求规则 1.1 指定模块名称 1.2 对请求提交方式的定义 1.3 以上两种规则的小实例 2.控制器接收请求参数的三种方式 2.1 逐个接收请求参数:请求中的参数名和控制器方法的形参名一样 2.2 逐个接收请求参数&#xff…