个人学习笔记,仅记录用
缓存相关 header
Expires:响应头,http 1.0 产物,代表资源过期时间。Cache-Control:请求/响应头,缓存控制字段,精确控制缓存策略If-Modified-Since:请求头,资源最近修改时间,由浏览器告诉服务器If-Node-Match:请求头,缓存资源标识Last-Modified:响应头,资源最近修改时间,由服务器告诉浏览器Etag:响应头,资源标识
缓存策略
没缓存
-
浏览器请求 -> 服务器;
-
服务器读取 -> 磁盘文件;
-
服务器响应 -> 浏览器。
问题:浪费用户流量,浪费服务器资源,影响用户体验(每次都要等待)
缓存到客户端本地
第一次请求成功后,将文件拷贝一份到本地磁盘,下次请求直接从磁盘读取。
问题:服务器文件更新时,浏览器获取不到最新的文件
服务器和浏览器约定资源过期时间
利用响应头Expires,服务器响应文件时,在响应头携带如(Expires:Mon, 26 Sep 2018 05:00:00 GMT),表示本地时间小于指定日期,则浏览器可以一直使用本地的缓存。
问题:浏览器依然不知道资源是否有修改
服务器告诉浏览器资源修改时间
服务器响应文件时,在响应头用 Last-Modified: (GMT)告诉浏览器文件的最新的修改时间,还有Expires。
当文件Expires过期时:浏览器带上If-Modified-Since(等于上一次请求的Last-Modified),请求服务器
服务器通过比较,请求头上的If-Modified-Since时间和实际文件最新修改时间:
- 如果一致:服务器响应(304),意思是告诉浏览器可以继续使用缓存
- 如果不一致:服务器读取磁盘文件响应给浏览器,同时浏览器根据响应头的Last-Modified和Expires,更新缓存文件的描述。
问题:Expires过期控制不稳定,因为浏览器端可以随意修改时间
继续改进,引入Cache-control
通过一个相对时间(相对这次请求时间)表示,如 Cache-control: max-age=10,意思是10秒内可以使用缓存。优先级高于Expires。
好处就是,如果在本地时间和服务器已经有偏差的情况下,使用max-age就没有偏差问题。
3. 总结
强制缓存
当浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。
Expires
HTTP/1.0产物,现在已经被HTTP/1.1的Cache-control替代。原因在于,Expires控制缓存原理是对比 “客户端的时间” 与 “服务器返回的时间” ,然而一旦客户端与服务器的时间不同步,那么强制缓存将失去意义。
Cache-control:
主要用于控制页面缓存,主要取值为:
public:所有内容都将被缓存;(客户端和代理服务器都可以缓存)private(默认值):所有内容只有客户端可以缓存;no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存决定;no-store:所有内容都不会被缓存,既不使用强制缓存和协商缓存;max-age=xxx:缓存内容将在xxx秒后失效
注:在无法确定客户端的时间是否与服务端的时间同步的情况下,相比于
Expires,Cache-Control是更好的选择。所以同时存在时,只有Cache-Control生效。
from memory cache 和 from disk cache 分别代表什么?分别在什么时候会使用?
内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:- 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。
- 时效性:一旦该进程关闭,则该进程的内存则会清空。
硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。
协商缓存
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
- 协商缓存生效,返回304;
- 协商缓存失效,返回200和请求结果。
控制协商缓存的字段有:Last-Modified / If-Modified-Since和Etag / If-None-Match。
Last-Modified / If-Modified-Since
Last-Modified:是服务器响应时,返回该资源在服务器最后被修改的时间。If-Modified-Since:是客户端再次发起请求时,上次请求中服务器响应的Last-Modified的值。
服务器通过判断,该资源在服务器的最后被修改的时间与请求头If-Modified-Since的值是否一致,若是则协商缓存生效,否则则协商缓存失效。
Etag / If-None-Match
Etag:是服务器响应时,返回当前资源的一个唯一标识。If-Node-Match:是客户端再次发起请求时,上次请求中服务器响应的Etag的值
服务器通过判断,该资源在服务器的Etag值与请求头If-Node-Match的值是否一致,若是则协商缓存生效,否则则协商缓存失效。
注:
Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效。