For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
我们在前几期的文章中给大家介绍和分析比较多的一般都是http的缓存,其他的缓存技术我们讲解的还是很少的,所以今天我们就通过案例来学习一下,CDN缓存规则与运作方法分享。
cdn缓存是一种服务端缓存,cdn服务商可以将源站上的资源缓到其各地的边缘服务器节点上。当用户访问该资源时,cdn再通过负载均衡将用户的请求调度到近的缓存节点上,有效减少了链路回源,提高了资源访问效率及可用性,降低带宽消耗。
缓存规则
与http缓存规则不同的是,这个规则并不是规范性的,而是由cdn服务商来制定,我们以JD内部CDN举例,打开cdn接入界面,面板如下。
可以看到,提供给我们的配置项只有文件类型(或文件目录)和Http2,在cdn节点上缓存默认遵循源站设置缓存时长。
运作流程
除了关注CDN缓存的文件类型及时间外,我们还需要引入一个概念——回源,客户端请求访问资源时,如果CDN节点上未缓存该资源,或者部署预热任务给CDN节点时,CDN节点会回源站获取资源。如图中所示,接入cdn后,我们提供服务的服务器就是源站,源站一般情况下只会在cdn节点没有资源或cdn资源失效时接收到cdn节点的资源请求,其他时间,源站并不会接收请求。简单的概括就是,没有资源就去源站读取,有资源就直接发送给用户。值得注意的是cdn中有s-maxage=0、max-age=0、no-cache、no-store、private中的任一种时候,该类型文件就被认定为不缓存文件,就是所有请求直接转发源站,只有当缓存时间大于0且缓存过期的时候,才会与源站对比缓存是否被修改。
缓存配置
与在Web浏览器中的缓存规则类似,可通过发送缓存指令标头来控制缓存在CDN中的执行方式。尽管大部分标头初都旨在解决客户端浏览器中的缓存问题,但现在所有中间缓存(如CDN)也会使用这些标头,可使用两个标头来定义缓存刷新:Cache-Control和Expires。如果两者都存在,则Cache-Control为新且优先于Expires。还有两种用于验证的标头类型(称为验证程序):ETag和Last-Modified。如果两者均已定义,则ETag为新且优先于Last-Modified。以OSS对象存储为例,在缓存配置的文档中特别有以下说明。
缓存继承
当用户请求您某一业务资源时,源站对应的ResponseHTTPHeader中存在Cache-Control字段,此时默认策略如下:
•Cache-Control字段为max-age,对该资源的缓存时间以配置的缓存时间为主,对于小于1小时的缓存时长,不继承max-age指定时间。
•Cache-Control字段为s-maxage=0、max-age=0、no-cache、no-store、private、nil或无Cache-Control字段时,对象存储会源节点会为CDN默认添加:Cache-Control:max-age=3600头部字段,已确保提高缓存的命中率,同时应对高并发回源流量带来的风险与成本的增加。
缓存影响
1.如果http缓存设置cache-control:max-age=600,即缓存10分钟,但对象存储cdn缓存配置中设置文件缓存时间默认为1小时,那么就会出现如下情况,文件被访问后20分钟修改并上传到服务器,用户重新访问资源,响应码会是304,对比缓存未修改,资源依然是旧的,一个小时后再次访问才能更新为新资源
2.如果不设置cache-control呢,在http缓存中我们说过,如果不设置cache-control,那么会有默认的缓存时间,但在这里,对象存储cdn服务商明确会在没有cache-control字段时主动帮我们添加cache-control:max-age=3600。
注:针对问题1,也并非没有办法,当我们必须要在缓存期内修改文件,并且不向想影响用户体验,那么我们可以使用cdn服务商提供的强制更新缓存功能,主要注意的是,这里的强制更新是更新服务端缓存,http缓存依然按照http头部规则进行自己的缓存处理,并不会受到影响。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。