HTTP缓存
笔记来自:MDN
主要有两种,私有缓存(private caches)或者共享缓存(shared caches)。

缓存控制头Cache-Control header
- 禁止缓存
每次请求都会下载完整的响应内容
Cache-Control: no-store,
Cache-Control: no-cache, no-store, must-revalidate
- 强制确认缓存
每次请求发出时,缓存会将此请求发送到服务器,该请求会带有与本地缓存相关的验证字段,服务器端会根据验证信息判断是否使用本地缓存。
Cache-Control: no-cache
- 私有缓存和公共缓存
"public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。若指定了"public",则一些通常不被中间人缓存的页面(译者注:因为默认是private)(比如 带有HTTP验证信息(帐号密码)的页面 或 某些特定影响状态码的页面),将会被其缓存。
而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
Cache-Control: private
Cache-Control: public
- 缓存过期机制
max-age=, 表明这个缓存相对于上次请求的时间间隔内是可以继续使用的,否则就应该失效。
Cache-Control: max-age=31536000
- 缓存验证
当使用must-revalidate时,表示在使用缓存前必须验证旧资源是否过期了。详情
Cache-Control: must-revalidate
为什么需要刷新缓存(freshness)
一旦资源被存储在缓存中,理论上应该一直存储着,但是由于缓存的空间是有限的,所以会周期性的移除一些已被缓存的资源,这个过程被称为缓存清除(cache eviction)。并且服务器上的资源可能已经更新了,所以cache也应该被更新。由于HTTP是一个client-server协议,当资源改变时服务器无法通知cache和client;它们只能通过过期机制(expiration),在没过期之前,这个资源是新的(fresh);过期后资源是stale(陈旧)状态。清除算法优先清理旧资源,但是实际上旧资源不是被清除算法清除的,当缓存系统收到一个对旧资源的请求时,它会将这个request带上If-None-Match字段去检查这个资源到底是新的还是旧的。如果是fresh状态,则返回304(Not Midified)header,并且response body不会包含请求的资源,这样的话还可以节省一些带宽。
下面是典型的缓存处理过程:
