http 缓存原理与机制
强制缓存机制 (过期时间机制): 基本原理: 在客户端第一次请求服务端时, 服务端会将缓存规则信息添加在 header 中, 客户端会通过这些信息判断是否能缓存. 若是强制缓存, 则 header 中会有两个字段来标记缓存失效的时间(expires 或 cache-control), 要指出的是在 HTTP1.0 中, 只支持 expires, 目前的浏览器默认都是 HTTP1.1 了, 基本都支持 cache-control. 在客户端第一次请求并添加缓存后, 以后每次客户端的请求响应数据都是缓存服务器提供的, 不会再经由服务端. 缓存服务器根据 cache-control 字段来判断何时更新缓存, 是否更新缓存, 是否可以使用缓存. cache-control 有下面几个参数: private, 允许客户端使用缓存 max-age, 缓存最大失效时长 public, 允许客户端和代理使用缓存 no-cache, 关闭强制缓存, 需要使用对比缓存 no-store, 所有内容都不使用缓存请求报文首部和响应报文首部都有 cache-control 对比缓存机制(条件式缓存机制): 基本原理: 1. 缓存命中的情况: 客户端会向缓存服务器请求获取缓存 header 标识, 客户端获取标识后, 会向后端服务器发送 header 标识规则, 若未失效便通知客户端使用缓存服务器缓存的数据(一般状态码为 304). 值得注意的是在客户端获取 header 标识后只会向后端服务器发送 header, 服务端也只会向客户端返回 header.2. 缓存未命中的情况: 客户端会向缓存服务器请求获取缓存 header 标识, 客户端获取标识后, 会向后端服务器发送 header 标识规则, 若失效便通知客户端不使用缓存服务器缓存的数据(一般状态码为 200), 并更新缓存. 对比缓存的标识: last-modified/if-modfied-since: 资源最后修改时间戳 etag/if-none-match: 资源校验码, 可以是类似 hash 值的算法(优先级高于 last-modified) 不管是以上哪一种都是为了比对当前缓存内容和后端服务器最新内容是否一致的. 若返回值为 304 则认为是一致, 则直接使用缓存; 若返回值是 200 则认为是不一致, 则更新缓存.
缓存方式: 1. 代理式缓存: 当用户发送请求时, 会先经由缓存服务器, 若缓存命中便直接返回给客户端, 若没命中则由缓存服务器向后端主机发送请求并相应给客户端, 再由缓存服务器判断是否缓存响应的内容. 2. 旁挂式缓存: 当用户发送请求时, 会先经由缓存服务器, 若缓存命中便直接返回给客户端, 若没命中则由客户端自己向后端主机发送请求并相应给客户端, 再由客户端判断是否缓存响应的内容.
varnish 是一款代理式缓存程序, 降低了客户端的要求, 客户端不需要判断哪些内容需要缓存哪些不需要缓存, 增强了用户体验. 现在一般都是使用代理式缓存模型.
varnish 的缓存存储机制:-s mallocfilepersistent (测试阶段, 还未有正式版)
来源: http://www.bubuko.com/infodetail-2752617.html