# HTTP缓存
先来看一个例子

这个请求的意思是:
* 本次请求返回了1024字节的数据
* 客户端最多缓存这次数据120秒
* 提供了一个token(Etag), 用来在数据过期以后和服务器检查资源是否过期
先说说Etag:
* 作用: 用来和服务器验证资源是否需要更新.
* 生成方法: 服务器生成,一般是hash值或者根据文件内容生成的,客户端不需要关心,只需要发送给服务器.
* 使用场景: 按照上面例子, 请求回来的120秒之后, 客户端再次发送, 这时已经不能使用上次请求的缓存了,因为已经过期,此时需要再次发送一个请求给到服务器端,并且带上Etag(If-None-Match), 服务器会验证文件内容是否更新,从而告诉客户端是从缓存里面拿还是下载新的数据.
总结: Etag的使用实际上**不需要客户端做很多事情**,因为浏览器已经做了所有的验证和请求的工作,唯一需要注意的是要确保服务器端设置了必要和正确的token值
Cache-Control:
no-cache就是每次都不能直接下载本地的缓存,都需要请求到服务器通过etag检查是否需要更新,如果不需要更新就直接拿local的数据.
no-store很简单就是不允许浏览器或者所有的中间环节缓存数据
public就是无论什么情况都会缓存,大多时候没有必要
private只允许某个用户储存相关数据,所以所有的中间环节都不能储存,比如代理或者CDN
max-age表示这次缓存能够在接下来的多长时间重复使用
优化注意事项(注意没有最好的方案,需要根据项目类型和结构来区分):
1. 同一个资源始终用同一个url,否则会让客户端缓存多份数据,url是区分大小写的
2. 确保服务器端给了正确的etag
3. 区分哪些资源可以被中间缓存
4. 每一个资源的生命周期都要确定下来
5. 搞一个好的缓存架构,确保更新和缓存并重,比如no-cache for index.html
6. 把经常更新的和不经常更新的文件区分开, 比如有的库不常更,有的逻辑经常更
原文链接: https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching
http缓存
原文:https://www.cnblogs.com/Liu-3/p/12035160.html