Cache的缓存作用
- 减少了冗余的数据传输,节省了网费。
- 减少了服务器的负担,
- 大大提高了网站的性能加快了客户端加载网页的速度
Cache缓存分类
- 强制缓存如果生效,不需要再和服务器发生交互,
- 对比缓存不管是否生效,都需要与服务端发生交互
- 两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,
- 也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则
强制缓存
强制缓存,在缓存数据未失效的情况下,可以直接使用缓存数据,
浏览器是如何判断缓存数据是否失效呢?
我们知道,在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中
对比缓存
顾名思义,需要进行比较判断是否可以使用缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,
客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,
服务器根据缓存标识进行判断,判断成功后,返回304状态码,
通知客户端比较成功,可以使用缓存数据。
Last-Modified
通过最后修改时间来判断缓存是否可用
响应时告诉客户端此资源的最后修改时间
If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),
发现资源具有Last-Modified声明,则再次向服务器请求时带上头If-Modified-Since。
服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行比对。
若最后修改时间较新,说明资源又被改动过,则响应最新的资源内容并返回200状态码;
若最后修改时间和If-Modified-Since一样,说明资源没有修改,则响应304表示未更新,
告知浏览器继续使用所保存的缓存文件
Cache-Control
private 客户端可以缓存
public 客户端和代理服务器都可以缓存
max-age=60 缓存内容将在60秒后失效
no-cache 需要使用对比缓存验证数据,强制向源服务器再次验证
no-store 所有内容都不会缓存,强制缓存和对比缓存都不会触发
no-cache & no-store的区别
no-cache 不缓存过期的资源,缓存会向服务器,进行有效处理确认之后处理资源
- no-cache应该是 do-not-serve-from-cache-without-revalidation
- no-cache的目的:为了防止从缓存中获取过期的资源
- no-store才是真正的不进行缓存
no-cache
no-cache 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处)
Pragma 当”no-cache”出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已
经在上次请求时已经缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新
max-age
max-age>0 时 直接从游览器缓存中 提取
max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改
有的话 返回200 ,无的话 返回304
如何不发送请求
浏览器会将文件缓存到Cache目录,
第二次请求时浏览器会先检查Cache目录下是否含有该文件,
如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
Expires
Expires是服务器响应消息头字段,
在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求,这是HTTP1.0的内容,
现在浏览器均默认使用HTTP1.1, 所以基本可以忽略C ache-Control与Expires的作用一致,
都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据,
如果同时设置的话,其优先级高于Expires