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:上个时代的产品,老当益壮。在较重负载情况下稳定性很出众。
#                                                                                                                        #
posted @ 2022-12-18 15:24  麦恒  阅读(68)  评论(0编辑  收藏  举报