Invidious缓存调优:3步让视频页面秒开
【免费下载链接】invidiousInvidious is an alternative front-end to YouTube项目地址: https://gitcode.com/GitHub_Trending/in/invidious
在 Invidious 上打开一个视频,第一次访问时要实时去 YouTube 拉取标题、时长这些元数据,网络一抖整个页面就卡住。Invidious 缓存机制正好治这个病:数据拉回来一次后存到本地,同一视频再来访问就直接读本地,重复请求和出口带宽都能省下一截。看懂下面这两层缓存,你第二次打开页面时基本是秒开。
🧊 30秒看懂原理
先说清楚定位:Invidious 不存视频文件,画面数据由播放器直接向 YouTube 要。缓存管的是"元数据"——标题、时长、观看数,再加上页面用到的 CSS、JS 和小图。你可以把它理解成快递柜:第一次让快递(YouTube)送货上门,货放进柜子里存着;后面的人再来取,直接开柜拿货,不用快递再跑一趟。
具体分两层:
第一层:内存缓存,管页面资源。静态文件第一次读取后会塞进内存,之后直接从内存发,总量上限 5MB:
CACHE_LIMIT = 5_000_000 # 5MB @cached_files = {} of String => {data: Bytes, filestat: File::Info}这两行来自 src/ext/kemal_static_file_handler.cr,意思是少读磁盘,顺带绕开"打开文件数过多"的报错。
第二层:数据库缓存,管视频元数据。视频元数据写入 PostgreSQL 数据库,保质期 6 小时,由定时任务每小时清一次过期的:
WHERE updated < (now() - interval '6 hours')这句 SQL 在 src/invidious/database/videos.cr 里,定期清理由 src/invidious/jobs/clear_expired_items_job.cr 负责。带保质期的设计,保证了你看到的观看数不会陈旧好几天。
⚡ 立即能做的3件事
- 6小时内重看同一个视频:元数据还在缓存里,不会再去敲 YouTube,第二次打开几乎瞬间出页面。
- 开启注释缓存:把 config/config.example.yml 里的
cache_annotations从false改成true,老式视频注释也会入库,省掉每次的拉取和解析。 - 保持
preload: true:播放器在页面加载时就预缓冲一小段视频数据,按播放键后不用对着黑屏干等。 - 自托管用户盯住
channel_refresh_interval(默认 30m):频道页按这个周期提前刷新,值小则数据更新鲜,值大则省带宽。
进阶调优
两处都要改源码后重新编译,适合自托管实例:
1. 元数据保质期从 6 小时拉长到 12 小时
WHERE updated < (now() - interval '12 hours')改法是把上一节提到的 videos.cr 里的'6 hours'换成'12 hours'。效果:缓存命中变多,对 YouTube 的元数据请求接近砍半;代价是数据最多陈旧 12 小时,适合内容变动不快的实例。
2. 静态资源内存缓存扩容
把 kemal_static_file_handler.cr 里的CACHE_LIMIT从 5MB 提到 10MB,写法是CACHE_LIMIT = 10_000_000。效果:更多 CSS/JS 能常驻内存,重复访问连磁盘都不用碰;代价是多占一倍内存,动手前先看看机器剩余内存。
常见坑与自查
遇到同一个视频第二次打开还是慢,可以试试打开浏览器网络面板看请求:如果还有对 YouTube 的实时请求,说明这条缓存已过期(超过 6 小时被清掉)并被清除,等它重新拉取,或按进阶部分把保质期拉长。
遇到服务器报"打开文件数过多",可以试试检查静态文件处理器——内置的内存缓存就是为了少开磁盘文件设计的,别改成每次直接读文件的模式,扩容CACHE_LIMIT更稳妥。
遇到老式视频的注释显示为空,可以试试确认cache_annotations是否开启。注意空注释、只有卡片的注释本来就不会入缓存,回落到实时拉取属于正常现象,不用反复重启服务。
遇到订阅频道页的数据显得陈旧,可以试试把channel_refresh_interval从默认 30m 调到 10m,频道刷新任务跑得更勤,代价是后台对 YouTube 的请求变多。
一句话总结:Invidious 的缓存 = 静态资源进内存 + 视频元数据进数据库 + 定时任务自动清旧货,照上面做三件事就能明显提速。如果你自托管的实例日后流量涨上来,按订阅列表预缓存热门内容是下一个值得折腾的方向。
【免费下载链接】invidiousInvidious is an alternative front-end to YouTube项目地址: https://gitcode.com/GitHub_Trending/in/invidious
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考