缓存类型(宏观)
- 共享缓存(能被各级代理缓存的缓存)
- 私有缓存(用户专享的缓存,不能被各级代理缓存)
缓存类型(微观)
- 浏览器缓存
- CDN缓存
- 代理服务器缓存
- 数据库缓存
- 应用层缓存
缓存规则
所谓缓存就是把获取的资源存起来,等下一次再需要该资源的时候,就从存储的地方拿到该资源,节省时间
缓存的规则由请求的响应头决定
强缓存
浏览器端的资源 css文件一般会存储到硬盘中每次读取的时候(from disk cache),js和图片等文件解析后会存储到内存中,每次读取的时候(from memory cache)
相关的headers
Expires(1.0)
Expires的值是一个GMT格式的时间字符串,比如:Expires:Thu,21 Jan 2018 23:39:02 GMT 如果在这个时间节点内,则命中强缓存
Cache-Control(1.1 优先级更高)
在HTTP/1.1中,Cache-Control是最重要的规则,常见的有6个属性值
- public - 所有的内容都会被任何中间节点缓存(浏览器和代理服务器)
- private(默认值) - 所内容只有浏览器可以缓存
- no-cache - 使用协商缓存,即当前cache-control规则不再生效,而是使用Etag或Last-Modified字段控制缓存
- no-store - 不缓存,不用强制缓存也不用协商缓存
- max-age - 其值为一个时间段,超出该时间段后,缓存内容将失效
- s-maxage(单位s) - 同max-age, 只用于共享缓存,优先级高于 max-age 和 Expires Header
协商缓存
协商缓存生效,返回304和Not Modified
协商缓存失效,返回200和请求结果
- last-Modified和If-Modified-Since
第一次响应的时候,会携带last-Modified,该字段记录的是资源最后的修改时间,之后的请求会传递请求头 If-Modified-Since,其值为第一次响应时 last-Modified的值,服务器会根据这个值与资源的最新修改时间进行比较,如果一致则命中缓存,否则就返回新的资源
- ETag和If-None-Match
第一响应的时候,会携带ETag,该字段记录的是资源的唯一标识(根据资源计算的hash值,只要资源有变动就会更新hash值),之后的请求会传递请求头If-None-Match,其值为第一次响应时ETag的值,服务器会根据这个值与资源的最新唯一标识进行比较,如果相同则命中缓存,否则就返回新的资源。