首页 > 配置文件 > cache.config配置之revalidate、ttl-in-cache和pin-in-cache

cache.config配置之revalidate、ttl-in-cache和pin-in-cache

2013年7月16日     浏览数:5,592 发表评论 阅读评论

cache.config配置中的revalidate、ttl-in-cache和pin-in-cache项由于意思比较接近,所以容易让人费解。故此做了点基本测试来尝试解释下这三项的异同。

  • revalidate
    认为还新鲜的时间,超过这个设定时间,需要回源检验对象是否新鲜。会影响http响应头部信息age。

  • ttl-in-cache
    强制缓存的时间,这个选项能够让ats忽略源的cache-control响应头部信息而强制缓存,并且认为对象在这个强制缓存时间里面是新鲜的。会影响http响应头部信息age。经测试发现其比revalidate优先级高。

  • pin-in-cache
    保留在缓存中的时间。为了避免热门对象会被删除,可以设置对象硬性保留在缓存中的时间,在设定的时期内,就算它已经过期了也不删除它。不会影响http响应头部信息age。

说明

由于pin-in-cache是不会影响http响应头部信息age的,所以可以不测试它带来的效果了,就理解它能够硬性保留对象在缓存中的时间即可。下面我们从效果上来分析下另外能够影响age信息的两项配置。
下面配置的dest_domain是回源的域名/ip。

测试环境说明

  • 在之前的blog——“ats新手测试环境搭建”中已经介绍过我的测试环境了。此次试验也是基于这个测试环境基础上。
  • nginx服务器跟ats在同一台机,ip为192.168.30.56,在nginx web配置目录放了图片文件1.gif

关于client请求头部no-cache的说明

请求头部信息是一直不变的,如下:

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情况下,会一直回源查询对象是否新鲜。
1

所以下面做如下配置忽略client端的no-cache信息:

traffic_line -s proxy.config.http.cache.ignore_client_no_cache -v 1
traffic_line -x

下面是实验测试结果

  • nginx配置expires off;cache.config不做任何配置

在忽略用户的no-cache情况下,源服务器又没有配置缓存时间的话,还分两种情况
* 对象已经在缓存中
* 对象还没在缓存中

对象已经在缓存中的时候ats遵循freahness _limit’='(date’ –’last_modified)’*’0.1来计算新鲜度。
age

在测试之后其实我已经做了如下操作替换了文件了,但是由于如上的判断新鲜度的方式认为缓存中的还是新鲜的。所以说,在源服务器不控制缓存时间和ats不控制缓存时间的情况下,是会导致用户取不到最新内容的。
cp

  • nginx配置expires off;cache.config配置dest_domain=192.168.30.56 ttl-in-cache=15s

对象能写入缓存,能保证对象在15s内是认为新鲜的。age在0-15s变化。

  • nginx配置expires off;cache.config配置dest_domain=192.168.30.56 revalidate=12s

对象没写入缓存,age一直是0。[cMsSf ]

  • nginx配置expires 10;

对象能写入到缓存中,age在0-10s之间。10s之后会回源检验一次对象是否新鲜。

  • nginx配置expires 10;cache.config配置dest_domain=192.168.30.56 revalidate=12s

对象能写入缓存中,age在0-12s之间,12s之后才会回源检验对象新鲜度。

  • nginx配置expires 10;cache.config配置dest_domain=192.168.30.56 revalidate=8s

对象能写入缓存中,age在0-8s之间,8s之后才会回源检验对象新鲜度。

  • nginx配置expires 10;cache.config配置dest_domain=192.168.30.56 ttl-in-cache=25s;dest_domain=. ttl-in-cache=20s

对象能写入缓存中,新鲜期为25s,遵循ttl-in-cache的配置。

  • nginx配置expires 10; cache.config配置dest_domain=192.168.30.56 revalidate=15s;dest_domain=. ttl-in-cache=20s

对象能写入缓存中,新鲜期为20s,遵循ttl-in-cache的配置。

  • nginx配置expires 10;cache.config配置 dest_domain=192.168.30.56 ttl-in-cache=15s;dest_domain=. ttl-in-cache=20s

对象能写入缓存中,新鲜期为15s,遵循前面ttl-in-cache的配置。

  • nginx配置expires 10; cache.config配置dest_domain=. ttl-in-cache=20s;dest_domain=192.168.30.56 ttl-in-cache=15s

对象能写入缓存中,新鲜期为20s,遵循前面ttl-in-cache的配置。

小结

优先级:ttl-in-cache>revalidate>expires(nginx)

  • revalidate 需要其他配置来保证对象能写入缓存中,如果不能写入缓存中,其配置无效。

  • ttl-in-cache 能够单独完成强制对象写入缓存中并保证认为的新鲜期,不需要额外的帮助使对象写入缓存中。

  • pin-in-cache 只是保证对象在缓存中不被删除,并不影响对象的新鲜度。

  • 在同级配置下,前面匹配的配置生效。

分类: 配置文件 标签:
  1. 2013年7月16日16:01 | #1

    不错,很容易懂。

  2. 永豪
    2013年7月17日22:30 | #2

    相当细致,这个文档是一个很有意义的功能测试模板啊

  3. 2013年8月15日08:23 | #3

    致远真活跃啊, 我最近没怎么去关注最新状态了
    “nginx配置expires 10;cache.config配置dest_domain=192.168.30.56 revalidate=12s
    对象能写入缓存中,age在0-12s之间,12s之后才会回源检验对象新鲜度。”

    之前我们线上碰到这个问题, revalidate是1d, 设置了404缓存300s, 结果404就被缓存了1d了. 这里有个比较纠结的地方就是到底遵循哪个好些.

  4. 纸鸢
    2013年8月15日15:52 | #4

    哦,原来404的是说想按照nginx的配置。。。@liujen

  5. lzdzhy
    2013年9月14日14:25 | #5

    老赵,你的OPEN团队是哪几位?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.