http缓存分为强缓存和协商缓存
强缓存是通过响应头中的Expires
或Cache_control
来实现的。
Expires
的配置是一个本地Date,它有一个弊端是取的是本地时间,当和服务器时间不同步时缓存不准确 在http1.1废弃
Cache_control
有以下6个属性
- no-cache 强制协商缓存
- no-store 禁止缓存策略(和no-cache互斥)
- private 资源自能被浏览器缓存(不填默认是private)
- public 资源既可以被浏览器缓存也可以被代理服务器缓存(和private互斥)
- max-age=s s为秒数,第一次缓存后,s秒内都读取强缓存
- s-maxage 代理服务器缓存的时长(必须和public一起用)
协商缓存时通过响应头中的Etag
和last-modified
来实现
Etag
的原理是当首次访问资源后会给这个资源一个文件哈希,再次访问请求头If-None-Match
会带上服务器给的哈希来对比哈希是否相同来实现
Etag
分强验证和弱验证,强验证会对整个资源进行计算,弱验证是对文件的一些属性进行计算
缺点:当文件过多或过大时Etag
的哈希计算影响服务器的性能
last-modified
的原理是当首次访问资源后会读出这个资源的修改日期,再次访问请求头If-Modified-Since
会带上服务器给的修改日期来对比是否相同来实现
缺点:修改日期最小单位是秒,当资源下次修改仍在同一秒内时,仍会命中缓存。当修改了文件的其它属性时,修改时间不会变,也会命中缓存。