Skip to content

[软技能] 第280天 请说说协商缓存和强缓存的区别? #1803

Open
@haizhilin2013

Description

@haizhilin2013
Collaborator

第280天 请说说协商缓存和强缓存的区别?

#1366

我也要出题

Activity

gostfather

gostfather commented on Feb 28, 2020

@gostfather

请求头中
强缓存cache-control设置max-age=315360000,
协商缓存通过etag、last-modified判断和服务端交互

zhaofeipeter

zhaofeipeter commented on Jul 28, 2020

@zhaofeipeter

强缓存根据给定的时间来判断是否使用缓存,不够灵活,浏览器有时候会用到过期资源
协商缓存根据服务端资源是否更新来确定是否使用缓存,能确保浏览器不会用到过期资源

d4c-27

d4c-27 commented on Apr 12, 2022

@d4c-27

强缓存:不会向服务器发送任何请求,直接从本地缓存中读取文件并返回Status Code: 200 OK
协商缓存: 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;

QQhuan

QQhuan commented on Apr 12, 2022

@QQhuan
  • 缓存减少了直接从源服务器获取资源次数,减少服务器负载,加快了的响应,提高用户的体验

  • 缓存策略:通常浏览器缓存策略分为两种:强缓存和协商缓存,并且缓存策略都是通过设置 HTTP Header 来实现的。

  • 强缓存:强缓存可以通过设置两种 HTTP Header 实现:ExpiresCache-Control。强缓存表示在缓存期间不需要请求,state code 为 200。

Expires 是 HTTP/1 的产物,表示资源会在 Wed, 22 Oct 2018 08:41:00 GMT 后过期,需要再次请求。并且 Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效。

Cache-Control 出现于 HTTP/1.1,优先级高于 Expires 。

  • 协商缓存:如果缓存过期了,就需要发起请求验证资源是否有更新。协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag 。当浏览器发起请求验证资源时,如果资源没有做改变,那么服务端就会返回 304 状态码,并且更新浏览器缓存有效期。

Last-Modified(对应If-Modified-Since)存在一些弊端:1. 如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务端不能命中缓存导致发送相同的资源; 2. 因为 Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源

因为以上这些弊端,所以在 HTTP / 1.1 出现了 ETag 。

ETag(对应If-None-Match) 类似于文件指纹,If-None-Match 会将当前 ETag 发送给服务器,询问该资源 ETag 是否变动,有变动的话就将新的资源发送回来。并且 ETag 优先级比 Last-Modified 高。

以上就是缓存策略的所有内容了,看到这里,不知道你是否存在这样一个疑问。如果什么缓存策略都没设置,那么浏览器会怎么处理?

对于这种情况,浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @haizhilin2013@zhaofeipeter@gostfather@QQhuan@d4c-27

        Issue actions

          [软技能] 第280天 请说说协商缓存和强缓存的区别? · Issue #1803 · haizlin/fe-interview