摘要:
我把91视频的缓存管理拆给你看:其实一点都不玄学(细节决定一切)导语 在视频类产品里,缓存管理并不是“黑盒子”或玄学——它由一堆权衡、策略和工程实现细节组成。把这些细节理... 我把91视频的缓存管理拆给你看:其实一点都不玄学(细节决定一切)
导语 在视频类产品里,缓存管理并不是“黑盒子”或玄学——它由一堆权衡、策略和工程实现细节组成。把这些细节理清楚,用户体验、启动速度、流量消耗和存储占用都会立刻变得可控。下面把一个成熟的视频缓存体系拆成零件,既有原理,也有实用策略与实现要点,方便工程师和产品经理参考落地。
为什么缓存管理值得花功夫
- 流畅播放:减少网络抖动导致的卡顿和重连。
- 节省带宽:避免重复下载相同数据。
- 控制存储:防止缓存无限膨胀占满用户设备。
- 用户体验:合理的缓存策略能在有限空间下保留用户常看内容并加快启动。
缓存可以拆分的核心维度
- 存储层级:内存缓存(解码前、索引)、磁盘缓存(视频分片、元数据)。
- 缓存对象粒度:整视频、分片(segment)、字节范围(range)。
- 元数据与数据分离:播放进度、索引、校验信息放DB,实际数据放文件。
- 生命周期与淘汰:硬限制(quota)与软限制(阈值触发清理)、淘汰策略(LRU/ LFU/ 结合权重)。
常见实现模式(可直接落地的参考) 1) 分片 + 索引表
- 把视频切成定长分片(比如 256KB/512KB/1MB),每个分片单独存文件或存一大文件内的偏移记录。
- 建立索引表(SQLite/LevelDB/小型KV),索引项包括:videoid、segmentindex、文件位置、长度、校验(可选)、最后访问时间。 优点:易于并发读写、碎片管理方便、淘汰粒度细。
2) 临时写入 + 原子替换
- 下载分片时先写入 temp 文件,下载完成并校验后原子重命名到正式目录,避免半截数据被当作有效缓存。
- 支持断点续传:记录已下载字节范围并继续补齐。
3) 合理的命名与目录结构
- 文件名:videoId_segmentIndex.hash
- 目录分层以避免单目录文件过多(比如 videoId 的前两位作为一级目录)。
- 元数据独立存放,清理数据时优先读取元数据判断引用关系。
淘汰策略与空间管理
- 采用“软限/硬限”双阈值:当使用量超过softQuota,后台异步开始清理(LRU);超过hardQuota则同步阻塞新缓存写入并强制清理。
- 权重策略:短视频 vs 长视频、VIP内容、近期播放频率,都可以给不同权重,保证常看内容优先保留。
- 空间回收策略:
- 优先删除未完成播放或最久未访问分片。
- 合并碎片并回收小分片导致的大量小文件。
- 清理操作要做在后台节流执行,避免在主线程阻塞或造成电池与IO峰值。
网络层与HTTP优化
- 支持 Range 请求与断点续传,配合 If-Range / ETag / Last-Modified 做条件请求,避免重复下载。
- 对静态资源使用合理的 Cache-Control:短缓存用于易变资源,长缓存用于不常更新的分片或 CDN 传输结果。
- Prefetch 策略:基于播放位置与用户行为预测预下载下一段或热门内容,但要避免过度预取导致浪费流量与空间。
并发与一致性
- 并发下载同一分片要去重:引入下载锁或请求合并机制,避免同一分片被多次并行下载。
- 读写并发:读取分片时需要支持边写边读(streaming),同时保证写入完整性(CRC/校验位)。
- 崩溃恢复:应用启动时检查未完成的 temp 文件和索引一致性,进行修复或丢弃。
用户可见功能与可控性
- 存储设置:允许用户设置缓存上限(自动、低、中、高)或选择清理策略(只清理自动缓存/清理全部)。
- 智能清理:在设备低存储时自动触发高级清理(仅清理非常用/已过期内容),并提示用户。
- 链接播放记录与缓存:播放历史与书签不随缓存清空删除,保证用户不丢失进度数据。
监控、测试与指标
- 观测指标:缓存命中率、平均下载速度、IOPS、磁盘占用、用户清理次数、预取命中率。
- 压力测试:模拟长时间观看、网络抖动、频繁清理和设备低存状态,确保可回退与鲁棒性。
- 数据完整性:定期校验分片校验和以发现损坏并重新下载,防止播放错误。
实现细节示例(伪代码)
- 写入流程:
- 请求分片,检查索引是否已有完整分片。
- 若无,申请写锁,创建 temp 文件写入。
- 完成后计算校验,写入索引并原子重命名。
- 释放写锁并更新 LRU 时间戳。
- 读取流程:
- 查询索引得到文件位置与偏移。
- 若分片正在下载,等待或直接读取已下载字节(支持边下边播)。
- 返回数据并更新访问时间。
性能与体验优化小贴士
- 分片大小经验值:对于移动网络,512KB-1MB 常是折中;太小导致索引膨胀,太大不利于预取与快速恢复。
- 将元数据放在轻量级数据库中,避免每次扫描文件系统导致启动慢。
- 对于热门短视频,优先保留最近24-72小时观看的内容。
- 在后台低电量或低存模式下自动降低预取与缓存保留策略,提升设备友好性。
结语 缓存管理没有神秘公式,只有一组在不同场景下的权衡与工程实现。把分片、索引、原子写入、淘汰策略和用户控件这几块做好,产品就能在流畅性、流量与存储之间平衡得好。愿这篇拆解能让你对“91视频”类产品的缓存机制有清晰的工程级认识,按需落地,少走弯路——细节真的决定一切。

