缓存
- 作用:使网页打开速度更快,减小服务器压力。
- 问题:当服务器资源更新后,缓存无法及时拿到服务器新的资源。
- 解决办法:缓存设置过期时间
- 缓存策略:
强缓存+协商缓存
强缓存
强缓存:就是在缓存没有过期的时候,浏览器可以直接决定使用缓存。
Expires
expires它的值就是一个过期时间,浏览器拿到这个时间值以后,就可以决定缓存有没有过期。
- 浏览器发起请求
- 服务器返回资源,并在响应头里新增
expires字段 - 浏览器再次发起请求,判断缓存有没有过期,没有直接请求缓存,缓存返回资源
- 问题:
Expires时间是服务端时间,比对的却是客户端时间,可能存在服务端和客户端时间不一致问题。
Cache-Control
在HTTP1.1引入的,跟Expires的作用是一致的,不同的是,Cache-Control采用的是过期时长。
max-age: 单位是秒;过期时长no-cache不使用强缓存no-store禁止缓存private只有浏览器可以缓存public浏览器、服务器、代理服务器都可以缓存
流程:
- 浏览器发起请求
- 服务器返回资源,并在响应头里新增
cache-control字段 - 浏览器再次发起请求,判断缓存有没有过期,没有直接请求缓存,缓存返回资源
协商缓存
当缓存过期后,浏览器需要咨询服务器,是否可以继续使用缓存。
- 如何实现协商的过程?
Last-Modified
Last-Modified 顾名思义就是最后修改时间
流程:
- 浏览器发起请求
- 服务器返回资源,并在响应头里新增
Last-Modified字段(服务器资源的最后修改时间) - 浏览器以后每次请求,都带上
If-Modified-Since,值就是Last-Modified - 服务器拿到
If-Modified-Since,去跟服务器当前的最后修改时间做比对,如果不过时,可以使用缓存,返回304状态,如果资源已经更新,给浏览器正常返回新的资源,返回200状态
问题
Last-Modified以秒级别记录,如果资源在1秒以内发生改变的话,last-modified是无感知的,它认为没有变化。
ETag
流程:
- 浏览器发起请求
- 服务器根据文件内容生成唯一标识,并通过相应头
ETag传送给浏览器 - 浏览器以后每次请求,都带上
If-None-Match,值就是ETag - 服务器拿到
If-None-Match,去跟服务器当前的ETag做比对,如果没有变化,就是没有过时,可以使用缓存,返回304状态,如果资源已经更新,给浏览器正常返回新的资源,返回200状态