应用层缓存技术-Http的强制缓存和协商缓存
1、Http强制缓存
强制缓存流程: 在第一次访问服务器获取到数据后,在数据过期之前不在向服务器发起请求获取数据;因此实现此
流程的核心就是如何知道数据什么时间过期。
强制缓存的过期时间是通过第一次访问服务器返回的响应头获取,在http1.0和http1.1版本中通过不同的响应头字段
来判断。
1.1) http1.0版本
通过 Expires 响应头中来实现;expires 表示资源会过期的时间,在过期时间内浏览器不会再次向服务器发起请求,
而是直接读取本地缓存数据库(from memory or from disk)中的信息,两种方式根据浏览器的策略随机获取
1.2) http1.1版本
强制缓存通过 Cache-Control
响应头来实现,Cache-Control有多个字段表示
private | 客户端可以缓存 | |
public | 客户端和代理服务器均可缓存 | |
max-age=xxx | 缓存资源将在xxx秒后过期 | 最常用,为了兼容,两个版本的强制缓存都会被实现 |
no-cache | 需要使用协商缓存来验证是否过期 | |
no-store | 不可缓存 |
总结:强制缓存只有首次请求才会向服务器发起通信,读取缓存资源时不会跟服务器通信,资源的状态码status=200,
资源的 size 为 from memory 或者 from disk ,http1.1的优先级高于http1.0
2、Http协商缓存
协商缓存和强制缓存的不同之处,就是协商缓存每次都需跟服务器通信,并会增加缓存标识,如果需要读取本地
缓存,则资源的状态码status=304.
http1.0和http1.1的实现方式依然不同
2.1)Http1.0版本
2.2)Http1.1版本
Http1.1版本,服务器通过Etag设置响应头缓存标识
总结: 协商缓存每次都会与服务器交互,第一次是拿数据和缓存标识的过程,从第二次开始浏览器询问服务器资源
是否有更新,每次请求都会传输数据,如果命中缓存,则服务器返回的资源状态码为304,而不是200;为了浏览器
兼容问题两个版本的缓存都会被实现,Http1.1的优先级高于Http1.0。