APP 从服务器下载 1 千个超短音频 MP3 文件做为离线播放用, 这些文件被 APP 储存在 SD 卡下的制定文件夹内. 现在需要这 1 千个 MP3 随时和服务器的源文件同步(文件名不变但是 MP3 内容会变化).
我现在让服务器每天生成源文件的 MD5 清单, 然后每天 APP 下载最新 MD5 清单后, 让一千个文件逐一和清单比对最新的 MD5 值. 如果 MD5 不一致则重新下载这个 MP3 文件.
现在问题是我发现 MD5 每天计算 1 千次太耗时间和资源, 请问有啥简单高效的方法确保上述手机内的 1 千个文件和服务器源文件同步? 谢谢
1
xuxuxu123 2020-11-05 10:33:30 +08:00 1
从更新时间入手?
本地文件有个变更时间,服务器最新文件也有个变更时间,然后判断时间差,超过范围就更新 不知道行不行,只是个提议 |
2
hongch 2020-11-05 10:33:33 +08:00
为什么后端不直接给一个接口,告诉你哪几个文件需要更新,然后直接更新这几个文件就可以了,耗时的无脑操作丢给后端去做
|
3
JDog 2020-11-05 10:36:09 +08:00
不用每次都计算文件 MD5 值吧~
可以把文件 id 和 MD5 值存在文件里做为元数据。 |
4
yaocai321 2020-11-05 10:39:36 +08:00
只需要知道哪些更新了呀 为什么要全量对比?
|
5
lijialong1313 2020-11-05 10:39:38 +08:00
@JDog 因为文件会变,所以需要每次都计算(只是不用全部计算)
可以结合 2 个,一个是数据库存个 id 和 md5,然后把 md5 整批丢到后端,后端比较后,返回需要下载的文件地址,然后前端再下载就行。这样应该比较省一点 |
6
janus77 2020-11-05 10:40:28 +08:00
如果你只需要服务端向手机同步,不需要手机向服务端同步的话(也就是手机端没有主动更新,只是被动接受更新)
那就直接用版本更新的方案来做嘛 |
8
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 |
9
ritaswc 2020-11-05 10:52:50 +08:00
这样做也方便你上 cdn 呀,cdn 同名文件更新内容很麻烦的哦
|
10
acidsweet 2020-11-05 10:53:27 +08:00
Git Diff 的思路吧,如果你本地不会去修改文件数量和内容,那 client--[commit_id]-->server 后服务端计算两者 diff,下发这部分文件让 client 覆盖就行;但是如果本地会修改的话,如果允许冗余,引入工作去和本地仓库的概念,先 git rest 工作区然后再 git pull ;如果不允许冗余,那比较麻烦了,可以先本地检查文件是不是被修改过,哪些被修改过然后将 commit_id 和这部分信息都给服务端由服务端决策需要更新的部分
|
11
Arthur5 2020-11-05 17:34:29 +08:00
这一批文件有一个版本号,任何文件改动一次版本号加 1,版本之间有差异的文件记录下来。手机每次只比较本地版本号与服务器版本号,版本号不同就把有差异文件下回来覆盖就行了
|
12
flynaj 2020-11-07 08:21:08 +08:00 via Android
简单的比较一下文件时间大小就行。
|