
# 如何提高缓存命中率
#### 背景信息
CDN缓存命中率低，会导致源站压力大，静态资源访问效率低。您可以针对导致CDN缓存命中率低的具体原因，选择对应的优化策略，来提高CDN的缓存命中率。CDN缓存命中率包括流量命中率和请求命中率。
- **流量命中率** = 命中缓存产生的流量 / 请求总流量

- **请求命中率** = 命中缓存的请求数 / 请求总数
  ![](https://support.huaweicloud.com/bestpractice-cdn/public_sys-resources/note_3.0-zh-cn.png)
  流量命中率越低，回源流量越大，源站的流出流量越大，源站带宽资源占用越大，其代表了源站服务器收到的负载压力，请重点关注流量命中率。
  
 
#### 查看缓存命中率
您可以登录CDN控制台查看流量命中率和请求命中率。
1. 登录[CDN控制台](https://console.huaweicloud.com/cdn/?locale=zh-cn#/cdn/overview)。
2. 在左侧菜单栏中，选择"业务监控 \> 命中率统计"。
3. 在命中率统计页面即可查看"流量命中率"和"请求命中率"。
   图1命中率统计   
   ![](https://support.huaweicloud.com/bestpractice-cdn/zh-cn_image_0000002506879356.png "点击放大") 
 
#### 优化缓存命中率
1. **合理设置缓存过期时间**
   CDN加速的本质是缓存加速，把源站资源缓存在遍布全球的节点上，用户可以就近从边缘节点获取资源，从而达到加速的效果。您可以通过CDN控制台合理设置缓存过期时间来提高缓存命中率，建议如下：
   - 对于不经常更新的静态文件（如图片类型、应用下载类型等），建议您将缓存时间设置为1个月以上。
   
   - 对于频繁更新的静态文件（如JS、CSS等），您可以根据实际业务情况设置。
   
   - 对于动态文件（如PHP、JSP、ASP等），建议您将缓存时间设置为0，即不缓存。
   
   
   详细的设置步骤和注意事项请见[如何设置缓存过期时间](https://support.huaweicloud.com/bestpractice-cdn/cdn_01_0133.html)。
   ![](https://support.huaweicloud.com/bestpractice-cdn/public_sys-resources/note_3.0-zh-cn.png)
   - 如果源站设置了s-maxage=0、max-age=0、no-cache、no-store、private，"缓存过期时间来源"设置为"源站"、"强制缓存"功能关闭，CDN节点将无法缓存源站资源，导致频繁回源。
   
   - 如果您的源站有多个主机，某个相同的资源在多个主机中的Last-modified、Etag、Content-Length不一致，CDN节点将无法缓存该资源，导致重复回源。
   
   - 如果源站资源更新，请刷新资源对应的URL，以保证用户可以获得最新的资源。
   
   - **如果您修改了缓存规则** ：
     - 新的规则仅对后面缓存的资源生效，已经缓存的资源需要等缓存过期后，再次缓存才会遵循新的缓存规则。
     
     - 如果您想要立即生效，请在修改缓存规则后执行缓存刷新操作。
      
     
2. **配置URL参数**
   目前大多数的网页请求都携带URL参数信息，参数以"？"开始，如果参数没有包含重要信息（如版本信息等），是否携带该参数访问不会影响用户获得正确的资源，可以选择将"URL参数"功能配置为"忽略参数"或"忽略指定参数"，提高缓存命中率，提升分发效率，详见[配置资源在CDN节点的缓存规则](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0116.html)。
   **典型应用**：
   - 终端用户首次访问URL"http://www.example.com/1.txt?test1"时，CDN无缓存，回源请求资源；第二次访问"http://www.example.com/1.txt?test2"时，由于配置了"URL参数"的"忽略参数"功能，所以"?"之后的参数不匹配，直接命中缓存"http://www.example.com/1.txt"。
   
   - 终端用户首次访问URL"http://www.example.com/1.txt?test1"时，CDN无缓存，回源请求资源；第二次访问"http://www.example.com/1.txt?test2"时，由于"URL参数"功能配置为"不忽略参数"，所以"?"之后的参数也需要匹配，要重新回源请求"http://www.example.com/1.txt?test2"。
    
3. **预热URL**
   CDN可以通过缓存预热将源站资源主动缓存到CDN节点，用户访问时就能直接从CDN节点获取到最新的资源，详见[缓存预热](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0113.html)。
   当您的域名初次接入CDN加速、活动发布时您可以将源站资源预热到CDN节点，用户访问资源时直接从CDN节点获取，从而提升CDN的缓存命中率。
   **典型场景**：
   - 初次接入CDN：域名初次接入CDN时，节点暂未缓存源站资源，此时，您可以将源站资源预热至CDN节点。后续用户访问资源将直接从就近的CDN节点获取资源，提升访问速度。
   
   - 安装包发布**：**新版本安装包或是升级包发布前，提前将资源预热至CDN节点。正式上线后，海量用户的下载请求将直接由全球加速节点响应，提升下载速度的同时，大幅度降低源站压力。
   
   - 运营活动**：**运营活动发布前，提前将活动页涉及到的静态资源预热至CDN节点。活动开始后，用户访问中所有静态资源均由加速节点响应，海量带宽储备保障用户服务可用性，提升用户体验。
    
4. **开启Range回源**
   Range回源是指源站在收到CDN节点回源请求时，根据HTTP请求头中的Range信息返回指定范围的数据给CDN节点。Range回源能有效缩短大文件的分发时间，提升回源效率，提高缓存命中率，详见[Range回源](https://support.huaweicloud.com/usermanual-cdn/cdn_01_0027.html)。
   **典型场景**：
   - 未开通Range时，用户想观看指定片段的视频，而CDN回源时需要获取整个视频，所以回源流量大于响应给用户的流量，从而造成缓存命中率降低。开启Range回源后，CDN将分片回源获取资源返回给用户，从而提升缓存命中率。
    
5. **其它**
   - **缓存资源需要更新时，尽量避免刷新目录**
     当源站某个资源更新时，一般需要通过刷新相应的URL来强制节点缓存资源过期。刷新目录会将目录内所有的资源全部置为过期，用户下次访问时将无法命中缓存，全部回源站请求资源，因此尽量避免刷新整个目录，尤其慎重刷新根目录。
     
   
   - **避免在URL中携带动态参数**
     如果您的URL中包含动态参数，如时间戳，CDN无法缓存该资源，导致频繁回源。
     
    
 
#### 判断URL是否命中缓存
1. 在浏览器Chrome上，按F12。
2. 选择"Network"。
3. 查看指定URL的响应头，查看头部信息，进行如下判断：
   - 如果有"x-hcs-proxy-type"头部，值为"1"即命中缓存，值为"0"即未命中缓存，不再查看其它头部；
   
   - 如果无"x-hcs-proxy-type"头部，而有"X-Cache-Lookup"头部，值为"Hit From MemCache"、"Hit From Disktank"或"Hit From Upstream"即为命中缓存，其它值表示未命中缓存，不再查看其它头部；
   
   - 如果同时无"x-hcs-proxy-type"、"X-Cache-Lookup"头部，有"age"头部，则值大于"0"即命中缓存，值为"0"即未命中缓存。
    
 
