Webkit的MemoryCache和DiskCache流程详解

MemoryCache简介:

MemoryCache顾名思义,就是将资源缓存到内存中,等待下次访问时不需要重新下载资源,而直接从内存中获取。Webkit早已支持memoryCache。

目前Webkit资源分成两类,一类是主资源,比如HTML页面,或者下载项,一类是派生资源,比如HTML页面中内嵌的图片或者脚本链接,分别对应代码中两个类:MainResourceLoader和SubresourceLoader。虽然Webkit支持memoryCache,但是也只是针对派生资源,它对应的类为CachedResource,用于保存原始数据(比如CSS,JS等),以及解码过的图片数据。

MemoryCache流程分析:(注:以image为例,其他资源流程类似)

下面以image为例分析其加载过程

1.  解析html页面的时候,解析到img标签,调用

HTMLImageElement::create创建HTMLImageElement对象,该对象包含HTMLImageLoader对象m_imageLoader

2. 解析到img的src属性,调用ImageLoader::updateFromElementIgnoringPreviousError

3. 调用ImageLoader::updateFromElement

4. 调用CachedResourceLoader::requestImage

5. 调用CachedResourceLoader::requestResource,根据缓存的情况policy字段确定是否可以从缓存获取(use),或者需要revalidate,或者需要直接从网络获取(load)

6. 调用CachedResourceLoader::loadResource

7. 根据Resource的类型调用createResource创建对应的CachedResource

8. 调用MemoryCache::add在cache中查找是否有对应的cache条目,如果没有创建之

9. 调用CachedImage::load

10.调用CachedResource::load

11.调用CachedResourceLoader::load

12.调用CachedResourceRequest::load

13.创建CachedResourceRequest 对象,它将作为SubresourceLoader的client

14.调用ResourceLoaderScheduler::scheduleSubresourceLoad

15.调用SubresourceLoader::create

16.调用ResourceLoadScheduler::requestTimerFired

17.调用ResourceLoader::start

18.调用ResourceHandle::create 发起请求

19.收到HTTP响应头部,调用ResourceLoader::didReceiveResponse

20.调用SubresourceLoader::didReceiveResponse处理响应头部,特别是同缓存相关的头部,比如304的status code。如果是304则直接向缓存获取,如果是200则通过网络加载

21.调用ResourceLoader::didReceiveResponse

22.收到体部数据,调用ResourceLoader::didReceiveData

23.调用SubresourceLoader::didReceiveData

24.调用ResourceLoader::didReceiveData

25.调用ResourceLoader::addData将数据存储到SharedBuffer里面

26.调用CachedResourceRequest::didReceiveData

27.数据获取完毕,调用ResourceLoader::didFinishLoading

28.调用SubresourceLoader::didFinishLoading

29.调用CachedResourceRequest::didFinishLoading

30.调用CachedResource::finish

31.调用CachedResourceLoader::loadDone

32.调用CachedImage::data,创建对应的Image对象,解码

MemoryCache时序图:

加入memoryCache:

从memoryCache获取:

DiskCache简介:

diskCache顾名思义,就是将资源缓存到磁盘中,等待下次访问时不需要重新下载资源,而直接从磁盘中获取,它的直接操作对象为CurlCacheManager。它与memoryCache最大的区别在于,当退出进程时,内存中的数据会被清空,而磁盘的数据不会,所以,当下次再进入该进程时,该进程仍可以从diskCache中获得数据,而memoryCache则不行。

diskCache与memoryCache相似之处就是也只能存储一些派生类资源文件。它的存储形式为一个index.dat文件,记录存储数据的url,然后再分别存储该url的response信息和content内容。Response信息最大作用就是用于判断服务器上该url的content内容是否被修改。具体详见:

http://baike.baidu.com/link?url=n5nx7f8fGB_-B3OieAvMvJIGeBNvipb9qGQhYO0YwwBLg6oxqv_05Up3JUJk4jZyAd-KiCM1Hmg4nR23B5BhSq

DiskCache流程分析:

1.  webkit已启动,就会创建CurlCacheManager对象

2.  CurlCacheManager构造函数会调用CurlCacheManager::setCacheDirectory

3.  调用fileExists判断文件夹是否存在,如果存在继续,否则调用makeAllDirectories创建文件夹

4.  调用CurlCacheManager::loadIndex(),如果本地有缓存文件,它就会从磁盘读取出来,并将数据保存在m_index这个变量中,该变量类型为HashMap<String,std::unique_ptr<CurlCacheEntry>> ,分别对应url和数据内容。

5.  调用headerCallback函数,返回codestatus为304未修改,就会去调用CurlCacheManager::getCachedResponse(),如果是200,就会下载数据,并将数据的url保存在一个m_LRUEntryList中

6.  调用CurlCacheManager::readCachedData()

7.  调用CurlCacheEntry::readCachedData()

8.  调用CurlCacheEntry::loadFileToBuffer()将文件中的内容读取出来保存在一个buffer中

9.  调用ResourceLoader::didReceiveData()将数据获取,此时数据没有通过网络下载,直接从本地获取

10.Webkit退出时,调用CurlCacheManager::~CurlCacheManager()

11.调用CurlCacheManager::saveIndex(),该函数会去将m_LRUEntryList中的url获取并写入index.dat文件中

MemoryCache时序图:

memoryCache和diskCache流程详解相关推荐

  1. 跨境电商三单对碰三单申报流程详解

    跨境电商三单对碰三单申报流程详解 概要:三单申报是指"电子订单.电子运单.支付凭证". 1.电子订单: 适合申报企业类型"电商企业.电商交易平台.电商境内代理企业&quo ...

  2. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  3. 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)

    - 点击上方"中国统计网"订阅我吧!- 我们在Spark高级分析指南 | 机器学习和分析流程详解(上)快速介绍了一下不同的高级分析应用和用力,从推荐到回归.但这只是实际高级分析过程 ...

  4. View的绘制-draw流程详解

    目录 作用 根据 measure 测量出的宽高,layout 布局的位置,渲染整个 View 树,将界面呈现出来. 具体分析 以下源码基于版本27 DecorView 的draw 流程 在<Vi ...

  5. 杂志订阅管理系统c++_电池管理系统BMS功能安全开发流程详解

    点击上面 "电动知家"可以订阅哦! BMS功能安全开发流程详解 BMS和ISO26262 - BMS & ISO26262简介 BMS即Battery Management ...

  6. View的绘制-layout流程详解

    目录 作用 根据 measure 测量出来的宽高,确定所有 View 的位置. 具体分析 View 本身的位置是通过它的四个点来控制的: 以下涉及到源码的部分都是版本27的,为方便理解观看,代码有所删 ...

  7. U-Boot启动流程详解

    参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...

  8. java isight zmf_isight集成catia和abaqus,nastran流程详解

    isight集成catia和abaqus,nastran流程详解 CAD软件中参数化建模,导入有限元软件中计算各个工况,isight根据计算结果调整模型参数,反复迭代计算的过程是尺寸优化的典型问题~ ...

  9. java处理请求的流程_Java Spring mvc请求处理流程详解

    Spring mvc请求处理流程详解 前言 spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过, ...

最新文章

  1. 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
  2. 如何编译安装wolfssl
  3. T-SQL 根据年月日创建DateTime
  4. java replaceall正则表达式_编写高性能Java代码的最佳实践
  5. mysql两者之间_Django和MySQL - 两者之间的数据是不同的
  6. 斗地主AI算法——第一章の业务逻辑
  7. c语言第一次作业程序题pta,c语言第一次作业程序题pta
  8. 字典式攻击及规避方案
  9. 2021中国统计摘要
  10. 浙江大学黄杨思博计算机学院,浙江大学2010-2011学年大学生学科竞赛获奖名单
  11. odin学习3之numbers
  12. 1114 Family Property (25 point(s))
  13. Eclipse中source folder、folder、package的区别?
  14. TBODY的使用方法和意义
  15. 会计记录accton
  16. SVM要点总结(一)
  17. 人群计数数据集汇总和详细介绍,全网最全,crowd counting datasets
  18. young GC和Full GC的区别、什么时候触发young gc和Full GC、如何优化GC
  19. 标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)
  20. 证书服务器,备份,还原

热门文章

  1. [java基础-4] 循环方法:方法声明.重载.递归
  2. 商业模式新生代_商业模式设计方法视觉化思考——《商业模式新生代》笔记之九...
  3. OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
  4. 将电脑内存插入其他未知导致开机报警
  5. 2009年世界最好的杀毒软件排名及下载
  6. 水电缴费系统php源码_php简易扫码付教育收费系统源码 v1.2
  7. MySQL密码策略和登录失败处理
  8. 手把手教你在浏览器上安装油猴
  9. 项目后台管理系统小结
  10. 粤语正字最新修正版(绝对权威)