索引短缓存切片长缓存
HLS 音视频由两类文件组成:m3u8 索引文件(播放列表)与 ts 或 fmp4 切片文件。索引会随录制或直播不断更新,必须短 TTL 甚至不缓存;切片一经生成内容就固定,文件名带序号天然不可变,适合长 TTL。把两类文件用同一套缓存策略,是音视频加速最常见的事故来源。
基本信息
| m3u8 索引 | 点播用短 TTL,直播用秒级 TTL 或不缓存 |
|---|---|
| ts / fmp4 切片 | 序号与内容绑定,可配较长 TTL |
| 回源方式 | 大切片依赖 Range 分片回源补齐,源站需支持 Range |
| 验证方式 | 分别查看索引与切片的响应头缓存策略 |
| 常见坑 | 切片与索引用同一规则,导致播放列表长时间不更新 |
典型使用场景
- 点播平台按文件类型拆分配置,提升切片命中率并降低回源
- 直播场景给 m3u8 配秒级 TTL,保证观众及时拿到新切片
- 长视频拖动进度条依赖 Range 请求,需要源站与 CDN 都支持分片
- 大文件首播卡顿,通过预热把热门切片提前推到边缘
- 活动直播结束后回收资源,避免长期占用缓存与存储
对比两类文件的缓存头
对比两类文件的缓存头
curl -sI https://cdn.example.com/vod/index.m3u8 | grep -i -E 'cache-control|age|x-cache'
curl -sI https://cdn.example.com/vod/seg-1000.ts | grep -i -E 'cache-control|age|content-length'
# 验证 Range 分片回源
curl -s -r 0-1023 -o /dev/null -w 'code=%{http_code} size=%{size_download}\n' https://cdn.example.com/vod/seg-1000.ts文件类型与策略
| 文件类型 | 建议 TTL | 原因 |
|---|---|---|
| 直播 m3u8 | 秒级或不缓存 | 内容持续追加,缓存久会卡住播放 |
| 点播 m3u8 | 较短 | 播放列表更新频率低于直播 |
| ts / fmp4 切片 | 长 | 内容不可变,序号区分版本 |
| 封面与海报 | 长 | 更新频率低 |
直播场景把 m3u8 缓存过久会出现播放列表停滞:播放器迟迟拿不到新切片,用户看到的是画面卡住不动。
切片体积越大,Range 分片回源越重要。源站不支持 Range 时,拖动进度条会触发整片重新下载,流量与延迟同时上升。
多码率切换的影响
多码率播放会在不同清晰度的索引之间来回切换,各档的 m3u8 与切片要按同一套策略配置;某一档过期时间不一致时,切换清晰度会出现明显卡顿。