关于OSS下CDN加速的缓存刷新问题

  • 问题描述:

    使用OSS存储图片,原图片被覆盖后,使用原链接还是访问到的旧图片,即返回的还是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,则表示该请求无法缓存。
posted @ 2021-01-07 11:36  Yeah的第七章  阅读(3560)  评论(0编辑  收藏  举报