HTTP缓存分为强缓存和协商缓存
强缓存:在客户端发起请求之前,先检查强缓存,查看强缓存的cache-control里的max-age,判断数据有没有过期,如果没有则直接使用该缓存。
注意:有些用户可能会在没有过期的时候点了刷新按钮,这个时候浏览器就会去请求服务端,要想避免这样做,可以在cache-control里面加一个immutable属性,这样用户再怎么刷新,只要max-age没有过期就不会去请求资源。
协商缓存:浏览器在加载资源时,如果没有命中强缓存,这时就会去请求服务器,再进行请求的时候,会携带两个参数,一个是Etag属性,另一个是Last-modified,带着这两个参数去检验缓存是否真的过期,如果没有过期,则会返回304状态码,表示缓存没有过期,可以使用旧缓存,如果已经过期,则会返回200状态码和数据。
-
Etag的作用:有时候编辑了文件,但是没有修改,但是Last-modified属性的时间就会改变,导致服务器会重新发送资源,但是Etag的出现就完美避免了这个问题,因为他是文件的唯一标识符
-
Last-modified和Etag各自的优缺点:
每个文件都有一个Etag和Last-modified属性,Erag要优先于Last-modified,两个属性各有优缺点,比如Last-modified很多时候不能感知文件是否发生变化,但是Etag可以;Last-modified仅仅记录了时间点,性能肯定要高于Etag,Etag记录的是哈希值。