当前位置:首页 > 实用技巧 >

缓存策略怎么用(写入缓存策略打开还是关掉)

来源:原点资讯(www.yd166.com)时间:2024-02-03 00:36:39作者:YD166手机阅读>>

作者:kevinylzhao,腾讯音乐前端开发工程师

浏览器缓存策略对于前端开发同学来说不陌生,大家都有一定的了解,但如果没有系统的归纳总结,可能三言两语很难说明白,甚至说错,尤其在面试过程中感触颇深,很多候选人对这类基础知识竟然都是一知半解,说出几个概念就没了,所以重新归纳总结下,温故而知新。

Web 缓存介绍

  • Web 缓存是指一个 Web 资源(如 html 页面,图片,js,数据等)存在于 Web 服务器和客户端(浏览器)之间的副本。
  • 缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的 URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。

Web 缓存的好处

  • 减少网络延迟,加快页面打开速度
  • 减少网络带宽消耗
  • 降低服务器压力
  • ...

HTTP 的缓存机制

简化的流程如下

缓存策略怎么用,写入缓存策略打开还是关掉(1)

根据什么规则缓存

  1. 新鲜度(过期机制):也就是缓存副本有效期。一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:
  • 含有完整的过期时间控制头信息(HTTP 协议报头),并且仍在有效期内;
  • 浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度;
  1. 校验值(验证机制):服务器返回资源的时候有时在控制头信息带上这个资源的实体标签 Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如果发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容。

HTTP 缓存的两个阶段

浏览器缓存一般分为两类:强缓存(也称本地缓存)和协商缓存(也称弱缓存)。

本地缓存阶段

浏览器发送请求前,会先去缓存里查看是否命中强缓存,如果命中,则直接从缓存中读取资源,不会发送请求到服务器。否则,进入下一步。

协商缓存阶段

当强缓存没有命中时,浏览器一定会向服务器发起请求。服务器会根据 Request Header 中的一些字段来判断是否命中协商缓存。如果命中,服务器会返回 304 响应,但是不会携带任何响应实体,只是告诉浏览器可以直接从浏览器缓存中获取这个资源。如果本地缓存和协商缓存都没有命中,则从直接从服务器加载资源。

启用&关闭缓存

按照本地缓存阶段和协商缓存阶段分类:

缓存策略怎么用,写入缓存策略打开还是关掉(2)

  1. 使用 HTML Meta 标签    Web 开发者可以在 HTML 页面的节点中加入标签,如下:

上述代码的作用是告诉浏览器当前页面不被缓存,事实上这种禁用缓存的形式用处很有限:

a. 仅有 IE 才能识别这段 meta 标签含义,其它主流浏览器仅识别“Cache-Control: no-store”的 meta 标签。

b. 在 IE 中识别到该 meta 标签含义,并不一定会在请求字段加上 Pragma,但的确会让当前页面每次都发新请求(仅限页面,页面上的资源则不受影响)。

  1. 使用缓存有关的 HTTP 消息报头 这里需要了解 HTTP 的基础知识。一个 URI 的完整 HTTP 协议交互过程是由 HTTP 请求和 HTTP 响应组成的。有关 HTTP 详细内容可参考《Hypertext Transfer Protocol — HTTP/1.1》、《HTTP 权威指南》等。

在 HTTP 请求和响应的消息报头中,常见的与缓存有关的消息报头有:

缓存策略怎么用,写入缓存策略打开还是关掉(3)

上图中只是常用的消息报头,下面来看下不同字段之间的关系和区别:

  1. Cache-Control 与 Expires
  2. Cache-Control:HTTP1.1 提出的特性,为了弥补 Expires 缺陷加入的,提供了更精确细致的缓存功能。详细了解详细看几个常见的指令:_ max-age:功能和 Expires 类似,但是后面跟一个以“秒”为单位的相对时间,来供浏览器计算过期时间。_ no-cache:提供了过期验证机制。(在 Chrome 的 devtools 中勾选 Disable cache 选项,发送的请求会去掉 If-Modified-Since 这个 Header。同时设置 Cache-Control:no-cache Pragma:no-cache,每次请求均为 200)
    • no-store:表示当前请求资源禁用缓存;
    • public:表示缓存的版本可以被代理服务器或者其他中间服务器识别;
    • private:表示只有用户自己的浏览器能够进行缓存,公共的代理服务器不允许缓存。
  • Expires:HTTP1.0 的特性,标识该资源过期的时间点,它是一个绝对值,格林威治时间(Greenwich Mean Time, GMT),即在这个时间点之后,缓存的资源过期;优先级:Cache-Control 优先级高于 Expires,为了兼容,通常两个头部同时设置;浏览器默认行为:其实就算 Response Header 中沒有设置 Cache-Control 和 Expires,浏览器仍然会缓存某些资源,这是浏览器的默认行为,是为了提升性能进行的优化,每个浏览器的行为可能不一致,有些浏览器甚至没有这样的优化。
  1. Last-Modified 与 ETag
  2. Last-Modified(Response Header)与 If-Modified-Since(Request Header)是一对报文头,属于 http 1.0。If-Modified-Since 是一个请求首部字段,并且只能用在 GET 或者 HEAD 请求中。Last-Modified 是一个响应首部字段,包含服务器认定的资源作出修改的日期及时间。当带着 If-Modified-Since 头访问服务器请求资源时,服务器会检查 Last-Modified,如果 Last-Modified 的时间早于或等于 If-Modified-Since 则会返回一个不带主体的 304 响应,否则将重新返回资源。(注意:在 Chrome 的 devtools 中勾选 Disable cache 选项后,发送的请求会去掉 If-Modified-Since 这个 Header。)
  • ETag 与 If-None-Match 是一对报文头,属于 http 1.1。ETag 是一个响应首部字段,它是根据实体内容生成的一段 hash 字符串,标识资源的状态,由服务端产生。If-None-Match 是一个条件式的请求首部。如果请求资源时在请求首部加上这个字段,值为之前服务器端返回的资源上的 ETag,则当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的时候,服务器才会返回带有所请求资源实体的 200 响应,否则服务器会返回不带实体的 304 响应。
  • ETag 能解决什么问题?

a. Last-Modified 标注的最后修改只能精确到秒级,如果某些文件在 1 秒钟以内,被修改多次的话,它将不能准确标注文件的新鲜度;

b. 某些文件也许会周期性的更改,但是它的内容并不改变(仅仅改变的修改时间),但 Last-Modified 却改变了,导致文件没法使用缓存;

c. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形。

  • 优先级:ETag 优先级比 Last-Modified 高,同时存在时会以 ETag 为准。
缓存位置

浏览器可以在内存、硬盘中开辟一个空间用于保存请求资源副本。我们经常调试时在 DevTools Network 里看到 Memory Cache(內存缓存)和 Disk Cache(硬盘缓存),指的就是缓存所在的位置。请求一个资源时,会按照优先级(Service Worker -> Memory Cache -> Disk Cache -> Push Cache)依次查找缓存,如果命中则使用缓存,否则发起请求。这里先介绍 Memory Cache 和 Disk Cache。

200 from memory cache

表示不访问服务器,直接从内存中读取缓存。因为缓存的资源保存在内存中,所以读取速度较快,但是关闭进程后,缓存资源也会随之销毁,一般来说,系统不会给内存分配较大的容量,因此内存缓存一般用于存储较小文件。同时内存缓存在有时效性要求的场景下也很有用(比如浏览器的隐私模式)。

200 from disk cache

表示不访问服务器,直接从硬盘中读取缓存。与内存相比,硬盘的读取速度相对较慢,但硬盘缓存持续的时间更长,关闭进程之后,缓存的资源仍然存在。由于硬盘的容量较大,因此一般用于存储大文件。

下图可清晰看出差别:

缓存策略怎么用,写入缓存策略打开还是关掉(4)

首页 123下一页

栏目热文

缓存怎么做到高可用(如何提高缓存的利用效率)

缓存怎么做到高可用(如何提高缓存的利用效率)

缓存如何做到高可用使用缓存承担大部分的读压力,可以缓解数据库的查询压力,提升了保证系统稳定性。分布式高可用方案分布式缓存...

2024-02-03 00:39:51查看全文 >>

缓存操作时应注意的问题(缓存一致性解决方案怎么设置)

缓存操作时应注意的问题(缓存一致性解决方案怎么设置)

数据缓存相关的注意事项:写入时复制(Copy-on-Write):写入时复制是一种策略,当数据需要被修改时,系统会先将原...

2024-02-03 00:20:50查看全文 >>

缓存服务器怎么使用(缓存服务器无法连接怎么解决)

缓存服务器怎么使用(缓存服务器无法连接怎么解决)

一个web缓存坐落于客户端和“原始服务器(origin server)”中间,它保留了所有可见内容的拷贝。NGINX 缓...

2024-02-03 00:45:33查看全文 >>

设置启用缓存(怎样设置才没有缓存)

设置启用缓存(怎样设置才没有缓存)

小伙伴家里的电脑是不是用久了就会提示出缓存不足,小伙伴们很迷糊,我8G内存怎么会缓存不足呢?其实内存和缓存的原理不一样的...

2024-02-03 00:35:42查看全文 >>

指定的缓存区在哪里(怎么找缓存路径)

指定的缓存区在哪里(怎么找缓存路径)

缓冲区的主要目的是进行流量整形,将大量的小规模I/O组织成稳定的少量大规模I/O,从而减少响应次数。换句话说,缓冲区用于...

2024-02-03 00:56:39查看全文 >>

使用缓存要注意什么(怎么正确处理缓存)

使用缓存要注意什么(怎么正确处理缓存)

阿里妹导读:响应时间长,遇到性能瓶颈时,开发者第一个想到的总是性能优化。《什么技能产品经理不会提,但技术人必须懂?》讲到...

2024-02-03 00:43:32查看全文 >>

配置cache是为了解决什么问题(为什么cache容量不能扩大)

配置cache是为了解决什么问题(为什么cache容量不能扩大)

一、单项选择题1. 我们说"买了一台64位的电脑",是指该电脑()。A.带宽为64位 B.字长为64位 ...

2024-02-03 00:16:14查看全文 >>

写入缓存策略打开还是关掉(笔记本的写入缓存策略要不要打勾)

写入缓存策略打开还是关掉(笔记本的写入缓存策略要不要打勾)

右键点击“计算机”,打开“设备管理”,选择你的SSD打开“属性”。 在写入缓存策略里的这个“关闭设备上的WINDOWS写...

2024-02-03 00:36:34查看全文 >>

dnf使徒特制帽子装扮外观图片(dnf使徒套装)

dnf使徒特制帽子装扮外观图片(dnf使徒套装)

DNF2020年春节使徒宝物自选礼盒中能开出很多奖励,比如使徒特质帽子装扮自选礼盒正是之一。那么那么作为新礼盒,使徒特质...

2024-02-03 00:13:50查看全文 >>

dnf使徒特制帽子装扮自选(dnf使徒套装)

dnf使徒特制帽子装扮自选(dnf使徒套装)

2020年春节礼包正式爆料属性了,大家一定也非常的关注这一个内容,本期就给大家对2020的礼包内容属性进行一个分析属性和...

2024-02-03 00:36:47查看全文 >>

文档排行