memoryCache和diskCache流程详解
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.电子订单: 适合申报企业类型"电商企业.电商交易平台.电商境内代理企业&quo ...
- Android事件流程详解
Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...
- 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)
- 点击上方"中国统计网"订阅我吧!- 我们在Spark高级分析指南 | 机器学习和分析流程详解(上)快速介绍了一下不同的高级分析应用和用力,从推荐到回归.但这只是实际高级分析过程 ...
- View的绘制-draw流程详解
目录 作用 根据 measure 测量出的宽高,layout 布局的位置,渲染整个 View 树,将界面呈现出来. 具体分析 以下源码基于版本27 DecorView 的draw 流程 在<Vi ...
- 杂志订阅管理系统c++_电池管理系统BMS功能安全开发流程详解
点击上面 "电动知家"可以订阅哦! BMS功能安全开发流程详解 BMS和ISO26262 - BMS & ISO26262简介 BMS即Battery Management ...
- View的绘制-layout流程详解
目录 作用 根据 measure 测量出来的宽高,确定所有 View 的位置. 具体分析 View 本身的位置是通过它的四个点来控制的: 以下涉及到源码的部分都是版本27的,为方便理解观看,代码有所删 ...
- U-Boot启动流程详解
参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...
- java isight zmf_isight集成catia和abaqus,nastran流程详解
isight集成catia和abaqus,nastran流程详解 CAD软件中参数化建模,导入有限元软件中计算各个工况,isight根据计算结果调整模型参数,反复迭代计算的过程是尺寸优化的典型问题~ ...
- java处理请求的流程_Java Spring mvc请求处理流程详解
Spring mvc请求处理流程详解 前言 spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过, ...
最新文章
- 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
- 如何编译安装wolfssl
- T-SQL 根据年月日创建DateTime
- java replaceall正则表达式_编写高性能Java代码的最佳实践
- mysql两者之间_Django和MySQL - 两者之间的数据是不同的
- 斗地主AI算法——第一章の业务逻辑
- c语言第一次作业程序题pta,c语言第一次作业程序题pta
- 字典式攻击及规避方案
- 2021中国统计摘要
- 浙江大学黄杨思博计算机学院,浙江大学2010-2011学年大学生学科竞赛获奖名单
- odin学习3之numbers
- 1114 Family Property (25 point(s))
- Eclipse中source folder、folder、package的区别?
- TBODY的使用方法和意义
- 会计记录accton
- SVM要点总结(一)
- 人群计数数据集汇总和详细介绍,全网最全,crowd counting datasets
- young GC和Full GC的区别、什么时候触发young gc和Full GC、如何优化GC
- 标准C库函数之perror()、strerror(),以及他们之间各种的优缺点(打印错误信息)
- 证书服务器,备份,还原
热门文章
- [java基础-4] 循环方法:方法声明.重载.递归
- 商业模式新生代_商业模式设计方法视觉化思考——《商业模式新生代》笔记之九...
- OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
- 将电脑内存插入其他未知导致开机报警
- 2009年世界最好的杀毒软件排名及下载
- 水电缴费系统php源码_php简易扫码付教育收费系统源码 v1.2
- MySQL密码策略和登录失败处理
- 手把手教你在浏览器上安装油猴
- 项目后台管理系统小结
- 粤语正字最新修正版(绝对权威)