web缓存
web缓存是可以自动保存常见文档副本的HTTP设备。当Web请求抵达缓存时,如果本地有"已缓存的"副本,可以从本地的存储设备而不是原始服务器设备中提取这个文档。
通过key-value键值方式缓存,key中保存了URL路径,value中保存了web内容,其均使用hash格式,算法保证能在海量数据中快速命中缓存内容
(1)缓存优点
1) 减少冗余的数据传输,节省带宽
2) 缓解网络瓶颈问题,无需耕宇宽带就能更快的加载页面
3) 降低对原始服务器的要求,服务器可以更快的响应避免过载
4) 降低了距离时延
(2)相关术语
缓存命中 | cache hit,可以用已有的副本为某些到达缓存的请求提供服务 |
缓存未命中 | cache miss,无缓存命中副本,被转向后端原始服务器 |
HTTP再验证 | revalidation,新鲜度检测,缓存副本和原始服务器上的数据要不时的进行检测是否为最新 |
命中率 | cache hit rate,缓存提供服务的请求所占的比例,命中率在0-1之间,通常用百分数描述 |
注意:
1) 命中率可以分为:文档命中率(从文档个数进行衡量)、字节命中率(从内容大小进行衡量)
2) 缓存对象由其生命周期,需要定期清理
3)当缓存空间耗尽,会采用LRU(最近最少使用算法)进行覆盖
4)不是所有的数据都能够缓存,如首部Authorization、Cookie、Vary:accept-encoding= … ...
(3)缓存处理的步骤:
接收请求 -->解析请求(提取请求的URL及各种首部) --> 查询缓存 --> 新鲜度检测 --> 创建响应报文--> 发送响应 --> 记录日志
2.HTTP首部缓存控制机制
Cache-Control: no-store禁止缓存对响应进行复制
Cache-Control: no-cache可以存储在本地缓存区域中,只是在于原始服务器进行新鲜度在验证之前缓存不能提供给客户端使用
Cache-Control:must-revalidate严格遵循过期信息,在实现没和服务器再验证不提供对象旧的副本。新鲜度检测失败返回504
Cache-Control: max-age读秒,仅适用于公共缓存
Expries日期首部到响应中,指明具体时间,不推荐使用
不添加过期信息,让缓存确定自己的过期日期
(1)新鲜度检测机制
在HTTP协议的报文首部会对web作出首部定义,通过首部的报文对比来做新鲜度检测。HTTP/1.0 Expires定义的是绝对时间,当达到指定的日期时间的时候,缓存失效;HTTP/1.1 Cache-Control:max-age=#定义的是相对时间,记秒,已解决HTTP/1.0协议在解决全球性数据缓存检测时各地区时差产生的问题
实例:
HTTP/1.0 Expires:Thu, 04 Jun 2015 23:38:18 GMT
HTTP/1.1Cache-Control:max-age=600
(2)有效性再验正:revalidate
如果原始内容未改变,则仅响应首部(不附带body部分),响应码304(Not Modified)
如果原始内容发生改变,则正常响应,响应码200;
如果原始内容消失,则响应404,此时缓存中的cacheobject也应该被删除;
说明:
相关条件式请求首部:If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match:
If-Modified-Sicce:<date> | 如果从指定日期之后文档被修改了,就执行请求的方法。可以与Last-Modified(最后被修改)服务器响应首部配合使用,只有在内容被修改后与已缓存版本有所不同时候采取获取内容 |
If-None_Match:<tags> | 标签,如果一缓存标签与服务器文档中的标签不同,If-None_Match首部就会执行请求的方法 |
HTTP缓存报文实例:
Cache-Control = "Cache-Control" ":"1#cache-directive
cache-directive = cache-request-directive
| cache-response-directive
cache-request-directive =
"no-cache"
| "no-store" (backup)
| "max-age" "="delta-seconds
| "max-stale" ["=" delta-seconds ]
| "min-fresh" "="delta-seconds
| "no-transform"
| "only-if-cached"
| cache-extension
cache-response-directive =
"public"
| "private" [ "="<"> 1#field-name <"> ]
| "no-cache" [ "="<"> 1#field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "="delta-seconds
| "s-maxage" "="delta-seconds
| cache-extension
3.常见的缓存服务开源解决方案