• 问题描述:
    使用OSS存储图片,原图片被覆盖后,使用原链接还是访问到的旧图片,即返回的还是CDN缓存的内容。由于服务历史原因,覆盖的文件名还是同名文件。
  • CDN节点上资源的缓存策略:

cdn缓存架构图 cdn缓存多久刷新一次_自动刷新

  • 解决方式一:
    在阿里云CDN控制台中开启CDN自动刷新,但该刷新时间不固定,取决于刷新任务作业的时间,可能10分钟,也可能半小时,经过简单测试,一般自动刷新的时间范围在10-20分钟左右。
    如果需要立即覆盖生效返回新内容的话,CDN自动刷新可能无法满足需求,阿里云在CDN文档中提供了手动刷新CDN缓存的API及自动刷新的脚本。可以在更新了某个文件后,对该文件进行CDN刷新操作,保证线上立刻能够获取到最近版本的文件。
  • 手动刷新API:
    刷新节点上的文件内容
  • 自动化脚本:
    刷新预热自动化脚本
  • 解决方式二:
    如果在站点或者服务中可以判断是否需要刷新资源的话,在文件路径后加上动态随机值,再次访问CDN则无法命中缓存,将会回源查询,将返回新资源内容。但是CDN上原缓存内容失效后,需要去除随机值,否则会导致CDN缓存一直无法命中。
  • 解决方式三:
    只开启CDN自动刷新功能,有资源覆盖情况下等待CDN缓存自动刷新即可,如果确实需要立即生效,则在控制台进行CDN刷新即可。这种方式就是手动操作了,适合频次很低的情况下使用。
  • 下面备注一些OSS请求文件的响应头,通过一些响应头可判断资源状况:
    OSS中返回的完整响应头如下:
Accept-Ranges: bytes
Age: 2433
Ali-Swift-Global-Savetime: 1609983652
Content-Length: 226863
Content-MD5: rTvI5hkONbouYYS0bAXK3A==
Content-Type: image/jpeg
Date: Thu, 07 Jan 2021 01:40:52 GMT
EagleId: 0e1d28a016099860855123037e
ETag: "AD3BC8E6190E35BA2E6184B46C05CADC"
Last-Modified: Wed, 06 Jan 2021 09:53:25 GMT
Server: Tengine
Timing-Allow-Origin: *
Via: cache56.l2cn2638[82,200-0,M], cache6.l2cn2638[84,0], cache14.cn1366[0,304-0,H], cache12.cn1366[3,0]
X-Cache: HIT TCP_IMS_HIT dirn:13:823421756
x-oss-cdn-auth: success
x-oss-hash-crc64ecma: 5457768927684361342
x-oss-object-type: Normal
x-oss-request-id: 5FF666A4E1B4FA343444814C
x-oss-server-time: 23
x-oss-storage-class: Standard
X-Swift-CacheTime: 3600
X-Swift-SaveTime: Thu, 07 Jan 2021 01:40:52 GMT

响应头

备注

X-Cache

如果显示HIT,则说明命中CDN节点上的缓存资源;如果显示MISS,则说明未命中CDN节点上的缓存资源,直接回源站获取

ETag

ETag在每个Object生成时创建,用于标识一个Object的内容;ETag值可以用于检查Object内容是否发生变化。不建议使用ETag值作为Object内容的MD5校验数据完整性的依据。

LastModified

Object最后被修改的时间。

X-Swift-CacheTime

字段值表示CDN节点上的允许缓存时间,即该文件可以在CDN节点上缓存多久。如果是0,则表示该请求无法缓存。