缓存类型:(私有缓存与共享(代理)缓存)
- 浏览器缓存:私有缓存
localStorage;
sessionStorage;
cookies;
indexedDB;
WebSQL;
http缓存;
DNS缓存:域名解析返回了正确的IP,系统会临时把这个返回结果存储起来; - 服务器缓存:
CDN缓存;
反向代理缓存;
负载均衡器;
网关缓存; - 数据库缓存:
在业务服务器和数据库之间增加缓存服务器redis;
数据库把数据临时存储在数据库的一个位置,再次发起相同请求时直接返回对应数据,不用对数据库进行重新查询;
缓存目的:
缓解服务器端压力,提升效率;减少等待时间,节约带宽;
HTTP缓存:
http缓存只能存储GET响应
HTTP/1.1缓存控制: - Cache-Control:请求头和响应头都支持这个属性
no-store:没有缓存,缓存中不得存储任何关于客户端请求和服务器端响应的内容;
no-cache:缓存但重新验证,客户端发出请求,缓存将带有验证的请求发送给服务器端,服务器端验证请求中的缓存是否过期,未过期返回304,缓存才使用本地缓存副本;
private:私有缓存,不能被中间代理,CDN缓存;
public:公共缓存;
max-age=<seconds>:过期时间;
must-revalidate:验证缓存是否过期; - Pragma:向后兼容基于HTTP/1.1的客户端,响应头中没有明确定义
缓存驱逐:
由于缓存只有有限的空间用于存储资源副本,所以缓存会定期地将一些副本删除。
新鲜度:
过期时间
本地检索到一个对应的陈旧资源(缓存副本),缓存将请求带有If-No-Match头发送给服务器端,服务器端返回304,则表示缓存副本为新鲜的
服务器通过 If-None-Match 或 If-Modified-Since判断后发现已过期,那么会带有该资源的实体内容返回
改进资源
缓存验证:
用户点击刷新按钮会开始缓存验证;
缓存的响应头带有Cache-control: must-revalidate;
浏览器偏好设置里设置Advanced->Cache为强制验证缓存。
当缓存的文档过期之后,需要进行缓存验证或者重新获取资源,服务器端返回校验器才开始验证。
ETags:强校验器
Etag的值对中间代理User Agent是不透明的一个值,如果响应头中带有Etag,请求时可以带上If-None-Match来验证缓存
Last-Modified:弱校验器(只精确到秒)
如果响应头中带有Last-Modified,请求时可以带上If-Modified-Since来验证缓存
当向服务端发起缓存校验时,服务端会返回http状态码,200 ok表示正常的结果或者304 not modified表示可以从本地缓存文件获取资源,304的响应头同时也可以更新缓存文档的过期时间。
Vary响应:
当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的Vary都匹配,才能使用缓存的响应。
网友评论