varnish01-缓存的基础概念
1、缓存的基础概念
1、为什么可以使用缓存:程序的运行具有局部性特征
- 时间局部性:一个数据被访问过之后,可能很快会被再次访问到。
- 空间局部性:一个数据被访问时,其周边的数据也有可能被访问到。(可以预加载周边数据到缓存)
- 热区:局部性。例如,一个电商站点,可能其中20%的商品承载了80%的访问量,这20%中又可能是其中的20%是热区。
2、缓存时效性
- 缓存空间耗尽:LRU(最近最少使用)。
- 缓存过期:缓存清理。
3、缓存命中率
- 缓存命中率的计算方法:hit/(hit+miss)。
- 缓存命中率的取值范围是:区间(0,1)。
- 缓存命中率有两种计算方式:
- 页面命中率:基于页面数量进行衡量
- 字节命中率:基于页面的大小体积进行衡量
4、缓存未被命中的原因
- 第一次被访问,还没有被缓存(热身)
- 缓存时间短,再次访问前过期清理了(增加缓存的保留时间)
- 缓存空间小,基于LRU被清理(大量缓存被LRU清理,增加缓存的空间)
5、数据是否可以被缓存
- 私有数据:private、private cache。(带认证信息的,带cookice的)
- 公共数据:public、public or private cache。
- 静态内容:可以缓存(jpg、jpeg、gif、png、js、css、html)
- 动态内容:是否缓存要三思
6、缓存层级
- 私有缓存:用户代理(浏览器)附带的本地缓存机制。
- 公共缓存:反向代理服务器的缓存功能。
- User-Agent <--> private cache <--> public cache <--> public cache 2 <--> Original
2、缓存的控制首部
- 响应报文中的控制头可能是:
- expires: Tue, 09 Aug 2022 07:44:38 GMT
- cache-control: public,max-age=86400
- etag: "f85ba57c3abd81:0"
- last-modified: Tue, 09 Aug 2022 07:44:38 GMT
1、缓存是否有效的判断机制
(1)过期时间
- HTTP/1.0:缓存过期时间使用绝对时间。
- 响应报文中的控制头是:expires
- HTTP/1.1:缓存过期时间使用相对时长。
- 响应报文中的控制头是:cache-control
(2)条件式请求
- Last-Modified/If-Modified-Since:基于文件的修改时间戳进行判别。(不精确)
- 客户端拿文件缓存时间询问服务器,文件是否有修改。
- 如果没有修改,服务器返回304,使用缓存。
- 如果修改了,服务器返回200和资源。
- 客户端拿文件缓存时间询问服务器,文件是否有修改。
- Etag/If-None-Match:基于文件的校验码进行判别。(耗资源)
- 客户端拿文件校验码询问服务器,文件是否有修改。
- 如果没有修改,服务器返回304,使用缓存。
- 如果修改了,服务器返回200和资源。
- 客户端拿文件校验码询问服务器,文件是否有修改。
(3)过期时间和条件式请求联合使用
- 过期时间失效前,直接使用缓存。
- 过期时间失效后,条件式请求。
2、控制首部Cache-Control的值的含义
(1)请求报文中的控制头cache-control是如何通知缓存服务使用缓存响应请求的
cache-control = "no-cache" #不能使用缓存进行响应 | "no-store" | "max-age" "=" delta-seconds | "max-stale" [ "=" delta-seconds ] | "min-fresh" "=" delta-seconds | "no-transform" | "only-if-cached" | cache-extension
(2)响应报文中的控制头cache-control是如何通知缓存服务器存储上级服务器的响应的
cache-control = "public" #公共缓存可以缓存,(私有缓存也可以缓存) | "private" [ "=" <"> 1#field-name <"> ] #仅私有缓存可以缓存 | "no-cache" [ "=" <"> 1#field-name <"> ] #可缓存,但响应给客户端之前需要revalidation(重写校验),即必须发出条件式请求进行缓存有效性验正; | "no-store" #不允许存储响应内容于缓存中 | "no-transform" | "must-revalidate" #必须重新校验 | "proxy-revalidate" #要由代理服务器重新校验 | "max-age" "=" delta-seconds #缓存的最大生命周期。当s-maxage不存在时,对公共缓存和私有缓存都有效 | "s-maxage" "=" delta-seconds #公共缓存的最大生命周期 | cache-extension
3、缓存的开源解决方案
- varnish和squid:
- 它们首先是反代,其次才是缓存,因为不反代是没法缓存的。
- httpd协议的可以有代理没有缓存,但只要是缓存就都是代理。
- varnish:可以实现反代、缓存和负载均衡。
- 它的并发承载能力不如nginx,但它的缓存能力nginx不能比拟的。
- 因此很多时候构建站点时会将nginx和varnish联合起来使用。
- 轻量级,并发能力也挺好,但负载超载时稳定性可能就不理想。
- squid:上个时代的产品,老当益壮。在较重负载情况下稳定性很出众。
# #