对于图像库,我使用亚马逊云端。
我已设定原点:
Cache-Control:max-age=31536000 (1 Year)
1 即可。当我已经设置了max-age时,将TTL 0(24小时)设置为1年 是否有用?
2 即可。当我将max-age设置为1年时,亚马逊会每24小时检查一次TTL0文件吗?
亚马逊说:
Objects are cached for the greater of the value of the Cache-Control max-age directive or the value of the CloudFront Minimum TTL
亚马逊也在说:
If an object in an edge location isn't frequently requested, CloudFront might evict the object—remove the object before its expiration date—to make room for objects that are more popular.
在这种情况下,我认为将TTL设置为年份是有用的,因为图像将保持肯定而不是之前?请纠正我。
感谢您的澄清。
答案 0 :(得分:2)
Cloudfront TTL not working的回答基本上回答了这个问题,尽管这个问题并不完全重复。
不,如果您要设置自己的Cache-Control:
标头,则最低TTL不是特别有用。
不,如果您的Cache-Control:
标头的最小TTL 或指定的年龄超过24小时,Cloudfront将不会每24小时检查一次。如果Cloudfront将检查对象,则该对象需要过期。从像Cloudfront这样的缓存的角度来看,最大允许年龄点是在最大允许年龄到期之前,不需要检查,因为预期对象不会过时。
生存时间(TTL)(不是“最小TTL”,只是TTL作为一般概念)是缓存(如Cloudfront)应该提供的最大时间量对象的副本,不与源服务器一起验证其对象的副本是否过时。生存时间是缓存可以保留对象而不验证其新鲜度的最大允许年龄。
最小TTL 不是缓存对象的最短时间。
最小TTL是用于确定最大允许年龄的最小值。它是TTL的最小值,并且仅指定最大年龄的最小下限,以便忽略指定较短 TTL而不是最小TTL的冲突Cache-Control:
标头,将被忽略,向上增加,使用最小TTL 代替(确定对象缓存中的最大允许年龄)。
同样,在没有任何其他指令的情况下,最小TTL 被用作对象的最大生命周期的唯一决定因素,在缓存中,是。
所以,不,将最小TTL和Cache-Control:
标题设置为相对较大的值将无效,因为正如您正确指出的那样:
对象的缓存是为了获取Cache-Control max-age指令的值或CloudFront Minimum TTL的值
- http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
但是,必须在了解缓存性质的情况下阅读本声明。缓存存储的内容 - 通常是缓存的性质 - 是易变的和短暂的,可以随时逐出。你也注意到了:
如果不经常请求边缘位置中的对象,CloudFront可能会逐出对象 - 在对象到期日之前删除该对象 - 为更受欢迎的对象腾出空间。
配置Cloudfront或您的原始服务器时,这不是可以避免的。有时物体被驱逐。只要最大年龄允许,它们可能并且经常被保留,有时甚至更长。
通常,CloudFront从边缘位置提供对象,直到对象过期。到期后,下一次边缘位置获得对象的最终用户请求时,CloudFront会将请求转发给源服务器,以验证缓存是否包含对象的最新版本:
如果CloudFront已有最新版本,则原点仅返回304状态代码(未修改)。
如果您不熟悉304 Not Modified
,您可能希望对其进行研究,以及通常从您的原始服务器触发此响应的If-Modified-Since:
请求标头。 (当然,在您缓存动态图像大小调整操作的结果的情况下,您的来源永远无法响应304
,除非它保留了自己先前响应的本地副本请求。)
同样重要且经常被忽视的是,Cloudfront不是一个单一的实体。在任何给定的时刻,特定对象要么“存储在”或“未存储在”Cloudfront中,这是不准确的。在撰写本文时,有超过50个边缘位置,并且对象可以存储在某些边缘位置而不存储在其他边缘位置。它可能从一个边缘位置提前驱逐,但不能从其他边缘驱逐。在从未请求过对象的边缘位置,在第一个请求发生导致获取对象之前,它永远不会被存储。