android/Kotlin: 手机 MP3 文件和服务器 MP3 文件同步方案

2020-11-05 10:27:52 +08:00
 sprinter

APP 从服务器下载 1 千个超短音频 MP3 文件做为离线播放用, 这些文件被 APP 储存在 SD 卡下的制定文件夹内. 现在需要这 1 千个 MP3 随时和服务器的源文件同步(文件名不变但是 MP3 内容会变化).

我现在让服务器每天生成源文件的 MD5 清单, 然后每天 APP 下载最新 MD5 清单后, 让一千个文件逐一和清单比对最新的 MD5 值. 如果 MD5 不一致则重新下载这个 MP3 文件.

现在问题是我发现 MD5 每天计算 1 千次太耗时间和资源, 请问有啥简单高效的方法确保上述手机内的 1 千个文件和服务器源文件同步? 谢谢

1747 次点击
所在节点    程序员
12 条回复
xuxuxu123
2020-11-05 10:33:30 +08:00
从更新时间入手?
本地文件有个变更时间,服务器最新文件也有个变更时间,然后判断时间差,超过范围就更新

不知道行不行,只是个提议
hongch
2020-11-05 10:33:33 +08:00
为什么后端不直接给一个接口,告诉你哪几个文件需要更新,然后直接更新这几个文件就可以了,耗时的无脑操作丢给后端去做
JDog
2020-11-05 10:36:09 +08:00
不用每次都计算文件 MD5 值吧~
可以把文件 id 和 MD5 值存在文件里做为元数据。
yaocai321
2020-11-05 10:39:36 +08:00
只需要知道哪些更新了呀 为什么要全量对比?
lijialong1313
2020-11-05 10:39:38 +08:00
@JDog 因为文件会变,所以需要每次都计算(只是不用全部计算)

可以结合 2 个,一个是数据库存个 id 和 md5,然后把 md5 整批丢到后端,后端比较后,返回需要下载的文件地址,然后前端再下载就行。这样应该比较省一点
janus77
2020-11-05 10:40:28 +08:00
如果你只需要服务端向手机同步,不需要手机向服务端同步的话(也就是手机端没有主动更新,只是被动接受更新)
那就直接用版本更新的方案来做嘛
sprinter
2020-11-05 10:42:53 +08:00
@janus77 对, 大哥 手机是被动更新, 请问"版本更新的方案"是指什么样的方案, 网上有类似现成的吗? 谢谢
ritaswc
2020-11-05 10:52:15 +08:00
如果让我做。我就会修改 url 上面的文件名,然后用一个映射表来做
比如
01.mp3 http://xxx.com/213aced123e1.mp3
02.mp3 http://xxx.com/213a32131231.mp3
这么写下去,每次修改 url 不就好了,省得再计算 md5
ritaswc
2020-11-05 10:52:50 +08:00
这样做也方便你上 cdn 呀,cdn 同名文件更新内容很麻烦的哦
acidsweet
2020-11-05 10:53:27 +08:00
Git Diff 的思路吧,如果你本地不会去修改文件数量和内容,那 client--[commit_id]-->server 后服务端计算两者 diff,下发这部分文件让 client 覆盖就行;但是如果本地会修改的话,如果允许冗余,引入工作去和本地仓库的概念,先 git rest 工作区然后再 git pull ;如果不允许冗余,那比较麻烦了,可以先本地检查文件是不是被修改过,哪些被修改过然后将 commit_id 和这部分信息都给服务端由服务端决策需要更新的部分
Arthur5
2020-11-05 17:34:29 +08:00
这一批文件有一个版本号,任何文件改动一次版本号加 1,版本之间有差异的文件记录下来。手机每次只比较本地版本号与服务器版本号,版本号不同就把有差异文件下回来覆盖就行了
flynaj
2020-11-07 08:21:08 +08:00
简单的比较一下文件时间大小就行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/721933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX