OkHttp 知识梳理(3) - OkHttp 之缓存基础

OkHttp 知识梳理系列文章

OkHttp 知识梳理(1) - OkHttp 源码解析之入门
OkHttp 知识梳理(2) - OkHttp 源码解析之异步请求 & 线程调度
OkHttp 知识梳理(3) - OkHttp 之缓存基础


一、缓存基础

在了解OkHttp的缓存实现之前,我们先来复习一下HTTP协议当中,与缓存有关的一些基础知识,这里,我们会介绍HTTP中与缓存相关的首部字段,根据首部字段的作用,可以将其分为以下四类:

通用首部字段

  • 请求报文和响应报文都会使用的首部。
  • Cache-Control

请求首部字段

  • 从客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
  • If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-Since

响应首部字段

  • 从服务器向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  • ETag

实体首部字段

  • 针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
  • Last-Modified

二、通用首部字段

2.1 简介

在通用首部字段中,与缓存有关的字段为Cache-ControlCache-ControlHTTP/1.1的通用首部字段,通过指定它的值,就能够操作缓存的工作机制。指令的参数是可选的,多个指令之间通过","分隔,首部字段Cache-Control的指令可用于 请求及响应 时。

Cache-Control : private, max-age=0, no-cache 

缓存请求指令

指令 说明
no-cache 强制向源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age=[s] 响应的最大age
max-stale=[s] 接收已过期的响应
min-fresh=[s] 期望在指定时间内的响应仍然有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension 新指令标记

缓存响应指令

指令 说明
public 可向任意方提供响应的缓存
private 仅向特定用户返回响应
no-cache 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age=[s] 响应的最大age
s-maxage=[s] 公共缓存服务器响应的最大age
cache-extension 新指令标记

2.2 具体含义

2.2.1 public

Cache-Control : public

当指定使用public指令时,则明确表示其它用户也可以利用缓存。

2.2.2 private

private
Cache-Control : private

当指定private指令时,响应只以特定的用户作为对象,这与public指令的行为相反,缓存服务器会对该特定的用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

2.2.3 no-cache

no-cache
Cache-Control : no-cache

使用no-cache的指令的目的是为了 防止从缓存中返回过期的资源

客户端发送的请求 中如果包含no-cache指令,则表示客户端将不会接收缓存过的指令。于是,“中间”缓存服务器必须把客户端请求转发给源服务器。

服务器返回的响应 中包含no-cache指令,那么缓存服务器不能对资源进行缓存,源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止缓存服务器对响应资源进行缓存操作。

Cache-Control : no-cache=Location

由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体制定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存,换言之,无参数值的首部字段可以使用缓存,只能在响应指令中指定该参数。

2.2.4 no-store

Cache-Control : no-store

当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息,因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

它和no-cache的区别在于,no-cache代表 不缓存过期的资源,而no-store真正的不缓存

2.2.5 s-maxage

Cache-Control : s-maxage=604800 (秒)

s-maxagemax-age指令的功能相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器,也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。

另外,当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。

2.2.6 max-age

max-age
Cache-Control : max-age=604800 (秒)

客户端发送的请求 中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0时,那么缓存服务器通常需要将请求转发给源服务器。

服务器返回的响应 中包含max-age指令时,缓存服务器将不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间。

HTTP/1.1版本中,会优先处理max-age指令,而忽略Expires首部字段。

2.2.7 min-refresh

min-refresh
Cache-Control : min-refresh=60 (秒)

min-refresh指令要求缓存服务器返回 至少还未过指定时间的缓存资源。比如,当指定min-refresh60s后,在这60s以内如果有超过有效期限的资源都无法作为响应返回了。

2.2.8 max-stale

Cache-Control : max-stale=3600 (秒)

使用max-stale可指示缓存资源,即使过期也照常接收。如果指令未指定参数,那么无论多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内,仍旧会被客户端接收。

2.2.9 only-if-cached

Cache-Control : only-if-cached

使用only-if-cached指令表示客户端 仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回504

2.2.10 must-revalidate

Cache-Control : must-revalidate

使用must-revalidate指令,代理会 向源服务器再次验证即将返回的响应缓存目前是否仍然有效

若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户一条504状态码。

另外,使用must-revalidate指令会忽略请求的max-stale指令。

2.2.11 proxy-revalidate

Cache-Control : proxy-revalidate

proxy-revalidate指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

2.2.12 no-transform

Cache-Control : no-transform

使用no-transform指令规定无论是在请求还是响应中,缓存都不能改变主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

三、请求首部字段

在请求首部字段中,与缓存相关的字段为If-XXX,像这种样式的请求首部字段,也称为条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

3.1 If-Match

If-Match

首部字段If-Match会告诉服务器匹配资源所用的实体标记ETag。服务器会比对ETag的字段值与资源的ETag值,仅当两者一致时,才会执行请求,反之则返回状态码412

还可以使用*指定If-Match的字段值,针对这种情况,服务器将会忽略ETag的值,只要资源存在就处理请求。

3.2 If-Modified-Since

If-Modified-Since

首部字段If-Modified-Since会告知服务器若字段值早于资源的更新时间,则希望处理该请求,反之,则返回状态码304

If-Modified-Since用于确认代理或客户端拥有的本地资源的有效性,获取资源的更新日期时间,可通过确认首部字段Last-Modified

3.3 If-None-Match

If-None-Match

If-Match作用相反。

3.4 If-Unmodified-Since

If-Modified-Since作用相反。

四、响应首部字段

首部字段ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。

另外,当资源更新时,ETag值也需要更新。生成ETag值时,并没有统一的算法规则,而仅仅是由服务器来分配。

强 ETag 值和弱 ETag 值

  • ETag值,无论实体发生多么细微的变化都会改变其值。
  • ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag的值。

五、实体首部字段

首部字段Last-Modified指明资源最终修改的时间。一般来说,这个值就是Request-URI指定资源被修改的时间。但类似使用CGI脚本进行动态数据处理时,该值有可能会变成数据最终最终修改时的时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259