事情的起因是自己做了一个网站,因为各种原因导致打开速度比较慢。项目经理检查代码时看到延迟加载的图片返回的http状态码一直都为200(PS:具体的状态码是200 ok from disk cache),认为每次都向服务器请求资源,这是不对的,所以向我反馈了这个问题,并要求修复。然后就是各种查资料,就有了下面这篇文章。

浏览器加载资源成功一般会有几种状态

200 ok           ---- 从原始服务器请求成功
200 ok from cache     ---- 不发请求
200 ok from disk cache   ---- 不发请求
200 ok from memory cache ---- 不发请求
304 not modified     ---- 向服务器发送请求,验证新鲜度,足够新鲜,服务器会返回 304状态

from cache 和 not modified的区别

200(From cache)是直接点击链接访问,输入网址按回车访问触发;
304(Not Modified)是刷新页面时触发,或是设置了长缓存、或当Entity Tags没有移除时触发。

当浏览器第一次加载资源的时候,返回一般为200,意思是成功获取资源,并会在浏览器的缓存中记录下max-age。

第二次访问的时候:
打开浏览器访问:那么浏览器会去判断这个资源在缓存里有没有,如果有的话,会去判断max-age,看看过期没有,如果没有过期,则直接读缓存,根本不会和服务器进行交互,换句话说,断网都能打开,就和本地跑一样!如果已经过期了,那就去服务器请求,等待服务器响应,这是很费时间的,服务器如果发现资源没有改变过,那么就会返回304,告诉浏览器,我没变过,你去读缓存吧,于是浏览器也不用从服务器拉数据了,然而,等待服务器响应也是一个很要命的问题,在网速发达的今天,等一个响应,有时比下载还慢。
刷新浏览器访问:那么浏览器不会去判断max-age了,直接去服务器拿,如果服务器判断资源没变过,则还是会返回304,和上面是一样的,所以刷新一下,其实很可怕,等于把所有的资源都要去服务器请求一边,问问服务器我过期了没有。

from memory cache 和 from disk cache 的区别

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

diskCache顾名思义,就是将资源缓存到磁盘中,等待下次访问时不需要重新下载资源,而直接从磁盘中获取,它的直接操作对象为CurlCacheManager。

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