首页 > 代码库 > 浏览器缓存
浏览器缓存
针对静态文件,动态文件需要 web server解析
浏览器缓存有强缓存,协商缓存和启发式缓存三种。
请求的基本过程,浏览器会先检查cache-control和expires,看资源是否缓存过期,不过期,直接使用本地缓存,不发请求
过期,则向服务器发送请求,服务器比对If-none-match和Etag,或者If-modified-since和last-modified字段,
看资源是否发生改变,如果未改变,则返回304,body为空,否则返回200,body为文件内容。
1.强缓存
cache-control和expires设置的缓存时间,第一次请求后,文件被缓存在本地
其中cache-control优先级高于expires
返回状态码 200 OK (from disk cache)
或者 200 OK (from memory cache)
总之,就是 200 (from cache)
2.协商缓存
http请求的response header中有 last-modified和Etag
浏览器再次请求该资源时候,会在 requrest header中携带
If-none-match(等于上次Etag的值)
If-modifed-since(等于上次last-modified的值)
想服务发送请求,服务器对比If-none-match和Etag,If-modified-since和last-modified的值,
如果一致,则返回304状态码,body为空。
不一致,则返回200状态码,body为文件内容。
其中Etag的优先级高于last-modified
返回状态码 304 Not Modified
3.启发式缓存
如果没有cache-control和expires的缓存设置,浏览器依然会有一个本地缓存策略,就是启发式缓存。
其计算方法如下:
http response header中的 Date(当前时间) 和 Last-Modified 的值
本地缓存时间 = (Date - Last-Modified) * 10%
因此,启发式缓存的缓存时间可长可短,建议明确设置缓存时间
返回状态码 200 OK (与正常的无缓存请求一致,实际上使用了本地缓存,没有发送请求)
chrome的Request Headers中会显示一行字
Provisional(临时的) header are shown, 表明此请求为启发式缓存的请求。
字段解释
Last-Modified:文件上次的修改时间
Etag:文件的唯一标识,类似于hash值
Etag解决了Last-Modified的哪些问题
1. Last-Modified的时间精确到秒级,当一个文件在1s内被多次修改,无法记录
2. 某些文件会被周期性修改,但内容不变,此时不想利用Last-Modified的值更新缓存
3. 某些服务器不能精确得到文件的最后修改时
http request http respose
If-Modified-Since -> Last-Modified 时间上对比,一致则返回304
If-None-Match -> Etag 内容上对比,一致则返回304
在第一次请求URL的时候,服务器讲 Last-Modified和Etag返回给客户端
在第二次请求此URL的时候,客户端将 If-Modified-Since 和 If-None-Match 发送到服务器
服务器将 If-Modified-Since 与 Last-Modified,If-None-Match 与 Etag做对比,一致则
返回304,否则返回200.
Expires
服务器返回的http response header中有Expires时,浏览器会在其标记的时间内不去下载请求的内容。
仅在地址栏输入地址有效,F5刷新无效。
Pragma和Cahce-Control
Http1.0的Pragma和Http1.1的Cache-Control可以用来控制页面缓存。
Pragma->no-cache, Expires->0 ,Cache-Control->no-cahce可以让页面不缓存。
Cache-Control的max-age可以设置页面在客户端缓存多少秒,是相对时间,并且覆盖Expires
Age:代理服务的缓存时间(单位秒)
Date:响应生成的时间
Vary:Vary:Accept-Encoding,User-Agent告诉代理服务,要缓存资源的压缩和未压缩两个版本
cache-contorl和pragma的no-cache设置,并不能完全禁用缓存
此设置只有部分浏览器支持,并且代理服务器由于不解析html文档,完全不支持此方式
用户行为与缓存的关系
1. 用户在 地址栏回车,页面链接跳转,新开窗口,前进,后退时,强缓存和协商缓存均有效
2. 用户在 F5刷新页面,强缓存无效,协商缓存有效
3. 用户在 ctrl+F5刷新页面,强缓存和协商缓存均无效
分布式系统的缓存
分布式系统的多台机器间的last-modified必须保持一致,而且尽量关闭Etag,
因为每台机器的Etag都会不一致
服务器缓存
服务器缓存属于共享缓存
包括
1. 代理服务器缓存
2. 源服务器缓存
3. CDN缓存
浏览器缓存