Chrome内存缓存与磁盘缓存比较

150

我对Chrome的内存缓存和磁盘缓存很感兴趣。我使用webpack、common chunks插件,并为所有文件生成chunkhash。

内存缓存和磁盘缓存有何区别?当我重新加载页面时,某些文件从内存缓存中加载,某些文件从磁盘缓存中加载(bundle.js和image.jpg从内存缓存中加载,css从磁盘缓存中加载)。有时候也会不同。我们能控制它们吗?选择从哪里加载?内存缓存似乎比磁盘缓存更快。


1
你好,Igor。这是否导致了Webpack的加载问题?你是如何解决的? - Rejoy
1
没有问题。这只是浏览器缓存功能缓存了Webpack捆绑文件。 - Igor-Vuk
嗨,Igor,我发现当一些捆绑文件从磁盘加载,而另一些从内存加载时,会出现问题。当发生这种情况时,它会抛出一个JSONP错误。这种情况只在极少数情况下发生。 - Rejoy
se/SuperUser - chharvey
3个回答

136

就像它们的名字所说:

"Memory Cache" 存储资源并从内存(RAM)中加载。因此速度更快,但它是非持久性的。只有在关闭浏览器前才能访问内容。

"Disk Cache" 是持久性的。缓存的资源存储在磁盘上并且可以从磁盘读取。

简单测试: 打开 Chrome 开发者工具 / 网络。多次重新加载页面。表格列“大小”将告诉您某些文件是“从内存缓存”加载的。 现在关闭浏览器,再次打开开发者工具 / 网络并重新加载该页面。因为内存缓存为空,所有缓存文件现在都是“从磁盘缓存”加载的。


6
我不知道它这么简单。 - Faizan Anwer Ali Rupani
82
浏览器如何确定哪些资源存储在内存缓存中,哪些资源存储在磁盘缓存中? - chharvey
23
我们能否配置在内存缓存中应该缓存什么? - Igor-Vuk
1
我在我的 Angular 应用程序中有一些项,当我本地运行它时,它们从磁盘加载,在生产环境中这些文件根本没有被缓存。只有内存中的缓存在生产环境中有效。你们知道是什么原因吗? - Rafael Andrade
2
如果响应使用了 cache-control: no-cache,为什么在网络工具中我仍然看到 "200 (from disk cache)"? - Eric Burel
显示剩余2条评论

38

Chrome在很多抽象级别上实现了缓存。核心是HTTP(浏览器)缓存 - 其他缓存机制的后端。通常,缓存可以分为:

  • HTTP缓存
  • Service Worker缓存
  • Blink缓存

HTTP缓存

网络上发出的每个请求都会由遵守RFC的HTTP缓存代理。第一次请求时会覆盖缓存。资源按原始URL进行键控。

Service Worker缓存

为了优雅地处理网络连接故障,可以使用Service Workers。缓存和缓存存储将再次从磁盘中获取。

Blink缓存

Blink在两种创建模式中使用Http缓存作为后端 - 内存和简单(文件系统)。使用哪一个取决于全局设置的缓存限制以及它们可以占用多少内存。当前渲染器缓存得到最大份额。缓存的内容是字体、图像和脚本。如果全局内存使用达到某个指定的阈值,则使用文件系统后端。

强制使用内存缓存

如果要覆盖默认机制从内存中提供文件,则可以实现自己的Service Worker。使用File API,资源可以被读取并存储到内存中的对象中。然后覆盖fetch事件将抑制网络和文件读取,并使用此全局对象提供内容。


0
在Google Chrome中,有两种主要类型的缓存:内存缓存和磁盘缓存。这些缓存机制共同工作,以优化网页的性能,并减少对资源的重复下载。
内存缓存: - 内存缓存,顾名思义,是位于计算机RAM(随机存取存储器)中的缓存。 - 它存储了最近访问的网页资源的副本,如HTML文件、图像、CSS、JavaScript等。 - 与磁盘缓存相比,内存缓存提供更快的资源访问速度,因为从RAM读取数据比从硬盘或固态硬盘读取要快得多。 - 由于RAM有限,内存缓存的容量较小。 - 当关闭浏览器或分配的内存被其他进程需要时,内存缓存会被清除。
磁盘缓存:
磁盘缓存是位于计算机硬盘或固态硬盘(SSD)上的缓存。
它作为缓存资源的辅助存储,用于存放无法容纳在内存缓存中或当前不需要在内存中的资源。
磁盘缓存的容量比内存缓存大,但由于涉及从存储驱动器读取数据,因此访问时间较慢。
即使关闭浏览器,缓存资源仍保留在磁盘缓存中,可供将来访问同一网站或在页面之间来回导航时使用。
总之,内存缓存对于频繁访问的资源更快且更高效,并且随着内存空间的需求而更频繁地清除。另一方面,磁盘缓存提供更大的存储容量,并在关闭浏览器后保留缓存资源,以便在后续访问时更快地访问。
内存缓存和磁盘缓存的结合使得Chrome(以及其他现代浏览器)能够通过在可用时快速提供缓存资源,从而减少需要通过网络获取的数据量,从而提供更流畅的浏览体验。这有助于改善页面加载时间和整体性能。

对于无法适应内存缓存的缓存资源,如何判断资源是否会超出内存缓存的容量? - undefined
可能不适合存储器缓存中的可用空间,尤其是如果缓存已经保存了其他资源。 - undefined
当前浏览器使用情况:如果您打开了多个标签页,每个标签页都有自己的资源集,那么内存缓存可能会更快地填满。 - undefined
chrome://net-internals: 这个页面提供了关于Chrome内部工作的大量信息,包括详细的缓存使用情况。您可以导航到“缓存”选项卡查看有关缓存资源的具体细节。 - undefined
关键是提供经过优化的网络资源(如压缩图像、缩小脚本),以便无论它们被缓存到何处,都能快速加载给最终用户。 - undefined
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接