浏览器缓存
参考:zhuanlan.zhihu.com/p/64635421
强缓存
如果命中强缓存的话,客户端不会再向服务端发送请求。 在Chrome中,如果命中强缓存的话,即使是没有真的发起请求,状态码会是200,from memory/disk cache(memory是保存在内存中,读取快,但是容量不大,可以认为是session级别的缓存)。而在FireFox中,状态码会是304。 判断方法:根据响应头中的expires和cache-control
- expires http1.0 一个具体的时间,如果在这个时间之内则命中缓存,否则请求过期。 缺点:客户端和服务器端时间不统一,可能会引起混乱。
- cache-control被用于在http请求和响应中 http1.1 常见值: max-age:3600表示缓存有效的时间长度是3600s。是基于请求时间。 no-cache: 不使用本地缓存,需要与服务器协商缓存。 no-store: 禁止浏览器缓存数据,类似于network中的disable-cache public: 可以被所有用户缓存,包括浏览器和cdn中间商等 private: 只能被客户端缓存
协商缓存
服务器决定是否可以继续试用缓存。 请求:If-Modified-Since/响应:Last-Modified 第一次请求之后,服务器返回文件带回来Last-Modified,表明文件上一次修改的时间。然后浏览器再一次请求的时候,会在If-Modified—Since中把Last-Modified添加上。
响应:If-None-Match / 请求:Etag 第一次请求后,服务器返回一个根据文件内容生成的Etag。等下一次请求的时候,浏览器会在If-Non-Match带上这个Etag,然后跟服务器端的Etag进行对比,判断文件时候发生变化。
为什么要有两对?
- 文件可能内容没变,但是修改时间变化,这个时候If-Modified-Since命中了,但是实际上没有必要再请求一次。
- 文件可能在一秒钟变化多次,但是If-Modified-Since的精度最多到1s
优先级:
Cache-Control > expires > Etag > Last-Modified
用户行为
F5: 有的浏览器会禁用掉强缓存 Ctrl + F5:会禁用强缓存和协商缓存
三层缓存机制
内存 => 硬盘 => 网络请求 => 缓存到内存和硬盘