memoryCache和diskCache流程详解

来源:互联网 发布:网络语戏精是什么意思? 编辑:程序博客网 时间:2024/06/08 10:31

Webkit的MemoryCache和DiskCache流程详解

MemoryCache简介:

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

    目前Webkit资源分成两类,一类是主资源,比如HTML页面,或者下载项,一类是派生资源,比如HTML页面中内嵌的图片或者脚本链接,分别对应代码中两个类:MainResourceLoaderSubresourceLoader。虽然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时序图:


0 0
原创粉丝点击