Linux
分类: LINUX
2015-07-02 15:39:12
cache.config配置中的revalidate、ttl-in-cache和pin-in-cache项由于意思比较接近,所以容易让人费解。故此做了点基本测试来尝试解释下这三项的异同。
ttl-in-cache
强制缓存的时间,这个选项能够让ats忽略源的cache-control响应头部信息而强制缓存,并且认为对象在这个强制缓存时间里面是新鲜的。会影响http响应头部信息age。经测试发现其比revalidate优先级高。
pin-in-cache
保留在缓存中的时间。为了避免热门对象会被删除,可以设置对象硬性保留在缓存中的时间,在设定的时期内,就算它已经过期了也不删除它。不会影响http响应头部信息age。
由于pin-in-cache是不会影响http响应头部信息age的,所以可以不测试它带来的效果了,就理解它能够硬性保留对象在缓存中的时间即可。下面我们从效果上来分析下另外能够影响age信息的两项配置。
下面配置的dest_domain是回源的域名/ip。
请求头部信息是一直不变的,如下:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding gzip, deflate Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Cache-Control no-cache Connection keep-alive Host 192.168.30.56 Pragma no-cache User-Agent Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
ats默认是遵循用户请求头部信息的cache-control的,由上可以看到请求头部是有带no-cache信息的,在ats不配置忽略client端的no-cache情况下,会一直回源查询对象是否新鲜。
所以下面做如下配置忽略client端的no-cache信息:
traffic_line -s proxy.config.http.cache.ignore_client_no_cache -v 1 traffic_line -x
在忽略用户的no-cache情况下,源服务器又没有配置缓存时间的话,还分两种情况
* 对象已经在缓存中
* 对象还没在缓存中
对象已经在缓存中的时候ats遵循freahness _limit’='(date’ –’last_modified)’*’0.1来计算新鲜度。
在测试之后其实我已经做了如下操作替换了文件了,但是由于如上的判断新鲜度的方式认为缓存中的还是新鲜的。所以说,在源服务器不控制缓存时间和ats不控制缓存时间的情况下,是会导致用户取不到最新内容的。
对象能写入缓存,能保证对象在15s内是认为新鲜的。age在0-15s变化。
对象没写入缓存,age一直是0。[cMsSf ]
对象能写入到缓存中,age在0-10s之间。10s之后会回源检验一次对象是否新鲜。
对象能写入缓存中,age在0-12s之间,12s之后才会回源检验对象新鲜度。
对象能写入缓存中,age在0-8s之间,8s之后才会回源检验对象新鲜度。
对象能写入缓存中,新鲜期为25s,遵循ttl-in-cache的配置。
对象能写入缓存中,新鲜期为20s,遵循ttl-in-cache的配置。
对象能写入缓存中,新鲜期为15s,遵循前面ttl-in-cache的配置。
对象能写入缓存中,新鲜期为20s,遵循前面ttl-in-cache的配置。
优先级:ttl-in-cache>revalidate>expires(nginx)
revalidate 需要其他配置来保证对象能写入缓存中,如果不能写入缓存中,其配置无效。
ttl-in-cache 能够单独完成强制对象写入缓存中并保证认为的新鲜期,不需要额外的帮助使对象写入缓存中。
pin-in-cache 只是保证对象在缓存中不被删除,并不影响对象的新鲜度。
在同级配置下,前面匹配的配置生效。