预缓存
约 605 字大约 2 分钟
2026-04-18
预缓存功能在用户实际播放之前提前获取 115 直链并缓存,使播放时实现零延迟响应。
触发方式
| 触发入口 | 场景 | 控制机制 |
|---|---|---|
| PlaybackInfo | 用户点击播放按钮 | 令牌桶限速 |
| 详情页 | 用户打开影片详情 | 速率检测 + 冷却期 |
| 剧集系列 | App 打开剧集卡片 | 流控检测 |
版本数限制
当一部影片存在多个清晰度版本时,系统按媒体类型独立控制预缓存的版本数量:
| 媒体类型 | 最大预缓存版本数 | 说明 |
|---|---|---|
| 电影 | 2 | 按码率从高到低取前 2 个版本 |
| 剧集 | 1 | 剧集通常只需缓存一个版本,减少 API 调用 |
版本截断策略
系统优先缓存码率最高的版本。对于剧集,由于单季可能包含大量集数,将版本截断数设为 1 可有效降低 115 接口调用量,避免触发风控。
防重复机制
快速浏览检测
电影详情、剧集详情、季详情共用同一个频率检测窗口,减少用户快速翻页时的重复预缓存请求。
单集冷却
剧集和季的预缓存新增单集级别的冷却机制:
- 某一集触发过预缓存后,再次进入相关详情页不会重复触发
- 避免同一集被多次预缓存
UA 策略
| 触发来源 | 使用的 UA |
|---|---|
| App 触发 | App 自身 UA(播放时直接命中) |
| 浏览器 / 无 UA | ios115UA |
播放放行机制
当预缓存正在获取直链时,用户可能已经点击了播放按钮。系统采用播放放行策略:
- 如果预缓存任务正在执行中(尚未完成),PlaybackInfo 请求会短暂等待预缓存结果
- 等待超时后直接放行播放请求,由播放流程自行获取直链
- 避免用户因预缓存阻塞而感到播放卡顿
与设备流控联动
被设备流控拦截的用户不会触发预缓存,避免浪费 115 接口调用额度。
性能提升
| 场景 | 无预缓存 | 有预缓存 |
|---|---|---|
| 首次播放(路径模式 + CD2) | ~353ms | ~0ms(缓存命中) |
| 首次播放(PK 模式) | ~550ms | ~0ms(缓存命中) |
| 首次播放(路径模式无 CD2) | ~1130ms | ~0ms(缓存命中) |

