CDN缓存相关问题及命中率优化

本文涉及的产品
.cn 域名,1个 12个月
简介: 本文详细介绍旅CDN缓存命中率的概念,分析了无法命中缓存的问题原因以及命中率降低影响因素,并针对命中率降低及如何优化做了分析和介绍。

提升缓存命中率的意义

CDN在静态资源加速场景的应用,是将静态资源缓存在距离客户端最近的CDN节点上。用户访问该资源时,直接从缓存中获取资源,避免通过较长的链路回源。如果CDN缓存命中率低,则会导致源站压力大,静态资源访问效率低。因此,CDN缓存命中率的高低直接影响用户体验,而保证较高的缓存命中率也成为了CDN的核心课题。可以针对导致CDN缓存命中率低的具体原因,选择对应的优化策略,来优化CDN的缓存命中率。CDN缓存命中率包括字节缓存命中率和请求缓存命中率。

  • 字节缓存命中率 = CDN缓存命中响应的字节数 / CDN所有请求响应的字节数
  • 请求缓存命中率 = CDN缓存命中的请求数 / CDN所有的请求数

image.png


如何判断缓存是否成功

我们可以通过打开浏览器审查元素来分析CDN返回的Response Header,其中X-Cache字段来判断是否命中缓存。
1.png
在 Response Headers 字段内,可以查看详细的请求和返回的报文信息。

  • Age:为CDN返回的头部字段,表示该文件在CDN节- 点上缓存的时间,单位为秒。只有文件存在于节点上Age字段才会出现,当文件被刷新后或者文件被清除的首次访问,在此前文件并未缓存,无Age头部字段,需要注意当Age为0时,表示节点已有文件的缓存,但由于缓存已过期,本次无法直接使用该缓存,需回源校验。
  • X-Swift-SaveTime:CDN节点上的缓存RS(swift)的时间,即该文件是在什么时间缓存到CDN节点上。
  • X-Swift-CacheTime:CDN节点上的允许缓存时间,即该文件可以在CDN节点上缓存多久,是指文件在CDN节点缓存的总时间。计算还有多久需要回源刷新= ’X-Swift-CacheTime’ – ‘Age’。
  • X-Cache:"HIT"表示已缓存,"MISS"表示节点上无该文件的缓存,回源请求。

为什么无法命中缓存

(1)客户端请求是动态请求
如果请求是动态请求,则无法命中CDN缓存。当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。
(2)源站返回强制不缓存的HTTP头
当源站配置了以下响应头时,即使配置了缓存规则,CDN也不会对该资源进行缓存,因为这些响应头在CDN缓存规则中的优先级较高。

  • 1:有s-maxage=0、max-age=0、no-cache、no-store、private中的任一种。
  • 2:有s-maxage或s-maxage=0。
  • 3:有Pragma: no-cache。

如下图,源站响应了no-cache和private导致CDN无法缓存,X-Cache字段为MISS,X-Swift-CacheTime为0。这种情况需要源站去掉这个HTTP响应头,具体可以参见Nginx缓存策略设置Apache缓存策略的设置IIS缓存策略的设置方法
image.png

(3)未返回响应头Etag和Last-modified
当CDN未配置缓存规则时,如果静态文件未返回响应头Etag和Last-modified,则该静态文件不能缓存在CDN节点上。解决方案就是源站配置返回Etag和Last-modified或者直接在CDN上配置缓存规则。
(4)全站加速未配置静态加速
全站加速默认走了动态加速,动态加速是每次回源的。如果需要走缓存的话,需要配置静态加速。目前配置静态加速支持按照文件类型、URI以及路径方式配置。如果全站加速没有配置静态加速的情况,则都是走动态加速的,全站加速节点响应的HTTP头没有X-Cache、X-Swift-CacheTime等字段的,类似如下图
image.png


影响CDN缓存命中率下降的因素

影响CDN缓存命中率下降的因素:
(1)刷新缓存,可能导致短时间内命中率下降。
(2)带宽突增,会导致CDN节点回源较多,命中率会表现有下降趋势。
(3)CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。
(4)缓存规则调整,可能会影响命中率。


缓存命中率低分析及优化

CDN控制台统计的缓存命中率仅仅是CDN L1层的命中率,实际情况L2层的缓存数据也是从CDN节点获取,并不会从源站获取数据,所以真实的CDN命中率是略高于CDN控制台显示的命中率。

另外查看CDN加速域名流量情况,在加速域名流量不高的情况下,即便MISS状态的URL不多,但是对命中率的统计计算影响很大。例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache,导致不缓存,在其他URL访问都命中的情况下,命中率也仅有90%。

在之前检查正常的情况下,有如下几种可能导致命中率低的情况,请逐一进行排查:
(1)源站上缓存Header设置不当,或者缺少必要的Header,如果CDN的缓存规则是不缓存,那么每次访问都是MISS状态,影响命中率,具体请参考前文“为什么无法命中缓存”的描述。
(2)CDN控制台设置了不缓存的规则,即某目录或者某种后缀的文件设置的缓存时间为0秒,相关信息可以在CDN控制台查看。
(3)源站动态内容较多,目前CDN主要是加速静态资源,例如CSS、JS、HTML、图片、txt、视频等资源,针对动态资源PHP、JSP、包含内部逻辑处理甚至Cookie等资源都会回源数据。
(4)CDN的加速URL中带有可变参数。例如URL地址为http://XXX.XXX.cn/1.txt?timestamp=14378923 ,其中timestamp值为时间戳,每次访问此值均不同。CDN针对第一次访问的URL,即之前未预热的URL,无论该URL是否符合CDN的缓存规则,由于节点上还没有这个文件,第一次访问肯定都是MISS状态。但是timestamp参数会变化,所以每次访问都是一个全新的URL,则每次都返回MISS状态,从而影响命中率。
(5)检查是否存在频繁刷新缓存的操作。
(6)文件热度不够。不经常被用户访问到的URL,即使符合所有缓存规则,但是经常有被节点去除缓存的风险。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关系。

针对以上情况,可以考虑通过"预热URL"、"配置资源缓存规则"、"过滤URL中可变参数"来优化缓存命中率,具体操作请参见优化CDN缓存命中率

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
2月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
87 1
|
10天前
|
缓存 监控 负载均衡
在使用CDN时,如何配置缓存规则以优化性能
在使用CDN时,如何配置缓存规则以优化性能
|
22天前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
64 5
|
22天前
|
缓存 NoSQL Java
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化
缓存菜品、套餐数据、mysql主从复制实现读写分离、前后端分离
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化
|
1月前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
2月前
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
40 2
|
2月前
|
Java 开发者 JavaScript
Struts 2 开发者的秘籍:隐藏的表单标签库功能,能否成为你下个项目的大杀器?
【8月更文挑战第31天】Struts 2表单标签库是提升Web页面交互体验的神器。它提供丰富的标签,如`<s:textfield>`和`<s:select>`,简化表单元素创建与管理,支持数据验证和动态选项展示。结合示例代码,如创建文本输入框并与Action类属性绑定,显著提升开发效率和用户体验。通过自定义按钮样式等功能,Struts 2表单标签库让开发者更专注于业务逻辑实现。
40 0
|
2月前
|
缓存 NoSQL 数据库
【超实用秘籍】FastAPI高手教你如何通过最佳实践构建高效Web应用:从代码组织到异步编程与缓存优化的全方位指南!
【8月更文挑战第31天】FastAPI凭借出色性能和易用性成为现代Web应用的首选框架。本文通过示例代码介绍构建高效FastAPI应用的最佳实践,包括开发环境搭建、代码模块化组织、异步编程及性能优化等。通过模块化设计和异步数据库操作,结合缓存技术,大幅提升应用性能与可维护性,助您轻松应对高并发场景。
43 0
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
|
15天前
|
安全 CDN
阿里云CDN产品解读及全站加速在游戏行业的最佳实践!
阿里云CDN(内容分发网络)为全球用户提供快速、稳定、安全的内容分发加速服务,显著提升访问响应速度和成功率