http请求的缓存机制

客户端缓存和服务端缓存

  • 客户端缓存:既浏览器缓存,保存在本地的缓存,用户可直接从本地读取数据,大大加快请求时间
  • 服务端缓存:代理服务器缓存或反向代理服务器缓存(nginx),CDN也是一种缓存机制,将数据存储在CDN节点中,大大加快用户的访问返回速度

缓存机制

在客户端决定使用本地缓存

在HTTP响应头部定义该资源的缓存策略,包含 Expires和Cache-Control,在此处命中缓存时,返回状态为200(from catch)nginx

Expires:
  • 表明资源到期时间,在此时间以前都可以直接从浏览器缓存取数据
  • 是http 1.0的策略,如今浏览器基本都是http1.1
Cache-Control:
  • Cache-Control比Expires的控制更加细致
  • 包含public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
  • public 表示响应可被任何缓存区缓存
  • private 只可单个用户的响应消息,不能被共享缓存
  • no-catch 在没有向服务器进行校验的状况下,不可用于后续请求
  • no-store 禁止缓存
  • max-age 当缓存策略为可缓存时指定缓存时间

跟服务端确认后使用本地缓存

Last-Modified/If-Modified-Since
  • HTTP响应头部定义Last-Modified,标示这个响应资源的最后修改时间
  • 以前的Cache-Control中的max-age过时时检验Last-Modified声明
  • 有Last-Modified(最后修改时间)声明则像服务器发请求,并带上If-Modified-Since(上次响应中Last-Modified的值)
  • 若是Last-Modified较新表示资源有修改,直接服务器中读取,响应200(OK);若是Last-Modified较旧,说明资源并无修改,响应304,客户端从本地读取缓存。
Etag/If-None-Match
  • 与Last-Modified相似,用来标志资源的有效性
  • Etag在服务端设置,表示当前资源的版本。在响应请求时告诉客户端当前的版本
  • 以前的Cache-Control中的max-age过时时检验是否有Etag。若是有的话,再次向web服务器请求时带上头If-None-Match (上一次Etag的值)
  • 若是If-None-Match与Etag值一致说明资源未被改动,响应304,客户端从本地读取缓存。若是值不同说明资源已经改动,返回200
Etag和Last-Modified的区别
  • Last-Modified标注时间,只能精确到秒级,若是一个资源在一秒内改变屡次则没法识别
  • 有时文件被改动,可是内容不变,Last-Modified也会变
  • Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的惟一标识符

先说返回200(from catch)和304的区别

200(from catch): 表示直接从本地浏览器缓存中读取,没有和服务器进行交互。第一次请求该资源的时候设置Expires 或者 Cache-Control: max-age头表示浏览器能够缓存该资源,下次请求的时候该资源还未过时,则能够从浏览器缓存中读取。web

304: 表示发送 "If-Modified-Since"请求到服务器,若是资源从上次请求到此次请求没有改变,则返回304。304的速度比200(from catch)更慢浏览器

相关文章
相关标签/搜索