Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

浏览器缓存 #12

Open
fygethub opened this issue Aug 21, 2020 · 0 comments
Open

浏览器缓存 #12

fygethub opened this issue Aug 21, 2020 · 0 comments

Comments

@fygethub
Copy link
Owner

缓存种类

浏览器自身的缓存严格意义上分为两种(严格意义上排除了cookie,storage,indexDb等)

1. memory cache

特指内存中的缓存、几乎所有的资源都能进入memory cache

  • 内存大小有上限,后打开的tab达到上限会释放之前的tab缓存
  • 作用范围为浏览器tab,关闭即释放
  • 优先级高于disk cache

2. disk cache

特指硬盘中的缓存。是持久缓存,会存在实际的文件系统中(浏览器安装文件的cache目录中)

  • 同样会有上线,浏览器自动清理
  • 比memory cache 要慢
  • 可跨回话访问同资源

其他

  1. 代理服务器缓存,存在网络中的共享缓存,面向大量用户,通过cache-control来控制是否允许代理服务器缓存
  2. CDN缓存,CDN分布网关的缓存,可以通过提供的接口刷新缓存
  3. service worker,html5的离线缓存技术,存储于浏览器cache storage(优先级最高)

缓存的策略

我们会根据自身的需要,设置缓存的策略来达到用户访问的性能提升,分别是:

1、 强缓存

通过设置cache control的max-age=time(相对时间)来控制(优先级高于http1.0的expires的绝对时间)。
如果资源处于max-age的有效时间,会直接浏览器缓存
cache control还有其他几个主要属性可以组合使用:

  • public 允许代理服务器和浏览器缓存
  • private 仅允许浏览器缓存
  • no-cache 绕过浏览器,直接请求服务器是否使用缓存(浏览器自身依然缓存)
  • no-stroe l浏览器和服务器都不可以缓存

2、协商缓存

当请求的资源过了max-age的有效时间,就会进入协商缓存阶段。这个时候请求服务器并携带If-None-Match:Etag
(根据文件内容生成的文件唯一标示)进行比较,一样则返回304,不一样则返回新资源和200。(etag优先级高于http1.0
的last-modified最后修改时间)

3、启发式缓存

当既没有设置max-age相对时间,也没有设置exprires绝对时间的时候,浏览器依然会请求缓存的内容,不是请求服务器而是
走协商缓存策略: 它的计算方式为根据响应头中2个时间字段 Date 和 Last-Modified 之间的时间差值,取其值的10%作为缓存时间周期

用户的行为

当cache control不是设置为no-store的时候:
1.打开新窗口 如果命中了强缓存,则请求disk cache,否则请求
2.刷新 如果存在缓存,优先命中memory cache ,其次是disk cache,否则请求
3.强制刷新 都会请求最新服务器资源
4.地址栏输入 同刷新

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant