SQLite 持久化:每个字节范围都被记住
为什么 SQLite 是下载管理器的好搭档
下载任务天然是「有状态的」:每个分段下载到哪个偏移量、哪些已经校验过、队列还有多少等待——这些状态如果只放内存,断电或崩溃就全丢了。FluxDown 选择把所有运行状态持久化到一个本地 SQLite 数据库,而不是把内存快照定时 dump 出去。
存了什么
SQLite 数据库文件位置:
- Windows(安装版) —
%APPDATA%\FluxDown\fluxdown.db - Windows(便携版) — 解压目录旁边的
data\fluxdown.db - macOS —
~/Library/Application Support/FluxDown/fluxdown.db - Linux —
~/.local/share/fluxdown/fluxdown.db - Docker Server —
/data/fluxdown.db(容器卷)
数据库里存的主要表:
| 表 | 存了什么 |
|---|---|
tasks | 任务元信息:URL、类型、状态(下载中/暂停/完成/失败)、起始时间、总大小 |
segments | 每个任务当前的分段与字节范围——这个表是断点续传的真相源 |
queues | 命名队列及其顺序、每日起止时间、并发数 |
settings | 所有偏好(主题、限速、BT/eD2K 参数等),键值形式 |
rss_feeds / rss_items | RSS 订阅与已过滤过的条目 |
plugins | 已安装插件与权限声明 |
webhooks | Webhook 端点与过滤规则 |
每次写入的粒度
分段表是关键——引擎每下载完一个分段(不一定是完整文件的大段,因为 Work Stealing 会继续劈),就原子更新该分段的已下载偏移。即使此刻断电,重启后引擎从数据库里读出最后一次提交的偏移,只需要重新拉取「最后一个未完成分段」的尾部。
这个设计比传统的「每下载 N 字节刷一次 checkpoint」更安全,因为写入总是在分段边界上,不会出现半写入状态。
与其他下载器的对比
| 下载器 | 持久化方式 | 断电恢复 |
|---|---|---|
| FluxDown | 实时写 SQLite 分段表 | 只重拉最后一个未完成分段 |
| IDM | .idx 分段文件 + 整体 checkpoint | 可能丢整个最后一个分段 |
| aria2 | .aria2 控制文件(每 30 秒 flush) | 丢 checkpoint 周期内的进度 |
备份与迁移
SQLite 数据库本身就是一个单文件。备份就是直接复制 fluxdown.db 到别的位置;迁移到新机器就是把这个文件放到新机器的应用数据目录里。
注意:只有桌面端的任务、队列、设置在这个文件里。云同步(可选登录后)会把设置(外观/下载偏好/BT/eD2K 参数)单独同步到账号,但下载本身永远只在本地,不走云端。