浏览器缓存

什么是浏览器缓存

MDN 上是这样解释浏览器缓存的:

A browser cache holds all documents downloaded via HTTP by the user ... without requiring an additional trip to the server.

意思就是,浏览器缓存保存着用户通过 HTTP 获取的所有资源,再下一次请求时可以避免重复向服务器发出多余的请求。

通俗的说,就是在你访问过一次某个网站之后,这个站点的文字、图片等所有资源都被下载到本地了,下次再访问该网站时判断是否满足缓存条件,如果满足就不用再花费时间去等待资源的获取了。

浏览器缓存的分类

一般来说浏览器缓存可以分为两类:

  • 强缓存

  • 协商缓存(对比缓存)

我们需要知道的是,浏览器在加载资源时,会先判断是否命中强缓存再验证是命中协商缓存

其它的的具体细节,稍后会展开来说。

强缓存

浏览器在加载资源时,会先根据本地缓存资源的 header 中的信息判断是否命中强缓存,如果命中则直接使用缓存中的资源不会再向服务器发送请求。

从图中可以看出,强缓存一般是这样一个流程:

  1. 查看 header 头中的 Expire 和 Cache-control 来判断是否满足规则;

  2. 如果满足规则,就返回缓存的数据;

  3. 如果不满足规则,就向服务器发送请求;

  4. 服务器返回数据;

  5. 将新数据存入缓存。

所以我们主要就是关注 Expire 和 Cache-control 这两个字段。

Expire

同样地,我们看看MDN中如何解释这个字段:

The Expires header contains the date/time after which the response is considered stale.

这个字段包含了一个时间,过了这个时间,响应将会失效。

也就是说,Expire 这个字段表示缓存到期时间,我们来打开一个网站并查看 Response Header 看看这个字段:

  •  
Expires:Fri, 27 Oct 2017 07:55:30 GMT

可能在你查看这的时候发现时间不对啊,怎么都已经是过去了 ~

GMT 表示的是格林威治时间,和北京时间相差8小时。

上面的这个时间表示的是 2017年10月27日15:55:30

通过设置 Expire 来设置缓存有一个致命缺点:

可以看出,这个是个绝对时间,也就是说,如果我修改了客户端的本地时间,是不是就会导致判断缓存失效了呢。

Cache-Control

既然不能设置绝对时间,那我就设置个相对时间呗。

在 HTTP/1.1 中,增加了一个字段 Cache-Control ,它包含一个 max-age 属性,该字段表示资源缓存的最大有效时间,这就是一个相对时间。

  •  
Cache-Control:max-age=600

这个表示的就是最大有效时间是 600s ,对的,它的单位是秒。

Cache-Control 除了 max-age 属性之外还有一些属性:

  • no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。

  • no-store:禁止使用缓存,每一次都要重新请求数据。

  • public:默认设置。

  • private:不能被多用户共享。

现在基本上都会同时设置 Expire 和 Cache-Control ,Cache-Control 的优先级别更高。

协商缓存

当强缓存没有命中的时候,浏览器会发送一个请求到服务器,服务器根据请求头中的部分信息来判断是否命中缓存。如果命中,则返回 304 ,告诉浏览器资源未更新,可使用本地的缓存。

从图中可以看出,协商缓存一般是这样一个流程:

  1. 把资源标识,比如 If-Modify-Since 或 Etag 发送到服务器,确认资源是否更新;

  2. 如果资源未更新,请求响应返回的http状态为 304 并且会显示一个 Not Modified 的字符串,告诉浏览器使用本地缓存;

  3. 如果资源已经更新,返回新的数据;

  4. 将新数据存入缓存。

Last-Modified,If-Modified-Since

浏览器第一次请求资源的时候,服务器返回的 header 上会带有一个 Last-Modified 字段,表示资源最后修改的时间。

  •  
Last-Modified: Fri, 27 Oct 2017 07:55:30 GMT

同样的,这是一个 GMT 的绝对时间。

当浏览器再次请求该资源时,请求头中会带有一个 If-Modified-Since 字段,这个值是第一次请求返回的 Last-Modified 的值。服务器收到这个请求后,将 If-Modified-Since 和当前的 Last-Modified 进行对比。如果相等,则说明资源未修改,返回 304,浏览器使用本地缓存。

well,这个方法也是有缺点的:

  • 最小单位是秒。也就是说如果我短时间内资源发生了改变,Last-Modified 并不会发生变化;

  • 周期性变化。如果这个资源在一个周期内修改回原来的样子了,我们认为是可以使用缓存的,但是 Last-Modified 可不这样认为。

所以,后来又引入一个 Etag

Etag

Etag 一般是由文件内容 hash 生成的,也就是说它可以保证资源的唯一性,资源发生改变就会导致 Etag 发生改变。

同样地,在浏览器第一次请求资源时,服务器会返回一个 Etag 标识。当再次请求该资源时, 会通过 If-no-match 字段将 Etag 发送回服务器,然后服务器进行比较,如果相等,则返回 304 表示未修改。

**Last-Modified 和 Etag 是可以同时设置的,服务器会优先校验 Etag,如果 Etag 相等就会继续比对 Last-Modified,最后才会决定是否返回 304。**

总结

当浏览器再次访问一个已经访问过的资源时,它会这样做:

  1. 看看是否命中强缓存,如果命中,就直接使用缓存了;

  2. 如果没有命中强缓存,就发请求到服务器检查是否命中协商缓存;

  3. 如果命中协商缓存,服务器会返回 304 告诉浏览器使用本地缓存;

  4. 否则,返回最新的资源。

内容概要:文章基于4A架构(业务架构、应用架构、数据架构、技术架构),对SAP的成本中心和利润中心进行了详细对比分析。业务架构上,成本中心是成本控制的责任单元,负责成本归集与控制,而利润中心是利润创造的独立实体,负责收入、成本和利润的核算。应用架构方面,两者都依托于SAP的CO模块,但功能有所区分,如成本中心侧重于成本要素归集和预算管理,利润中心则关注内部交易核算和获利能力分析。数据架构中,成本中心与利润中心存在多对一的关系,交易数据通过成本归集、分摊和利润计算流程联动。技术架构依赖SAP S/4HANA的内存计算和ABAP技术,支持实时核算与跨系统集成。总结来看,成本中心和利润中心在4A架构下相互关联,共同为企业提供精细化管理和决策支持。 适合人群:从事企业财务管理、成本控制或利润核算的专业人员,以及对SAP系统有一定了解的企业信息化管理人员。 使用场景及目标:①帮助企业理解成本中心和利润中心在4A架构下的运作机制;②指导企业在实施SAP系统时合理配置成本中心和利润中心,优化业务流程;③提升企业对成本和利润的精细化管理水平,支持业务决策。 其他说明:文章不仅阐述了理论概念,还提供了具体的应用场景和技术实现方式,有助于读者全面理解并应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值