缓存知识梳理

Posted by Asser's Blog on April 18, 2018

缓存

http请求和响应包括的报文包括两部分
	1. header(cookie, 缓存规则等)
	2. body (传输数据)

浏览器内含有一个缓存数据库专门用于存储缓存内容和缓存规则

缓存分为强缓存(强制缓存)和弱缓存(对比缓存)两种。其中强缓存的优先级大于弱缓存
> 仅针对强缓存部分:
	请求缓存数据库 => 含有有效缓存? 从缓存数据库中取出缓存 : 从服务器请求数据并更新缓存规则,存储内容进入缓存数据库
> 仅针对弱缓存部分:
	获取缓存标识 => 请求服务器校验缓存标识对应数据是否失效(状态码304) ? 从缓存数据库中取出缓存 : 从服务器请求数据并更新缓存规则,存储内容进入缓存数据库

强缓存判断依据 Expires / Cache-control
	Expires 用于http1.0,为服务器返回的缓存到期时间(服务器端时间与客户端可能存在误差)(基本废除使用)
	Cache-control 用于http1.1, 
		常用取值:
			private(客户端可缓存)
			public(客户端与代理服务器均可以缓存)
			max-age=xxx(在xxx秒后失效)
			no-cache(需要用对比缓存校验数据)
			no-store(不用缓存)

对比缓存详解
	服务器在第一次被请求时返回资源最后一次被修改的时间Last-modified
	再次请求时,客户端请求头以if-modified-since字段发送上次存储的时间
	if-modified-since > 资源最后被改动的时间 : 返回200和最新资源 : 返回304

	Etag
		服务器请求时,告诉浏览器当前资源的唯一标识
	if-None-match
		再次请求服务器时,通过此字段缓存数据的唯一标识
		if-None-match !== 服务器该资源唯一标识 ? 返回200和最新资源 : 返回304

	Etag/If-None-match 优先级大于 Last-modified/if-modified-since