V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sprinter
V2EX  ›  程序员

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

  •  
  •   sprinter · 2020-11-05 10:27:52 +08:00 · 1871 次点击
    这是一个创建于 1497 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    12 条回复    2020-11-07 08:21:08 +08:00
    xuxuxu123
        1
    xuxuxu123  
       2020-11-05 10:33:30 +08:00   ❤️ 1
    从更新时间入手?
    本地文件有个变更时间,服务器最新文件也有个变更时间,然后判断时间差,超过范围就更新

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

    可以结合 2 个,一个是数据库存个 id 和 md5,然后把 md5 整批丢到后端,后端比较后,返回需要下载的文件地址,然后前端再下载就行。这样应该比较省一点
    janus77
        6
    janus77  
       2020-11-05 10:40:28 +08:00
    如果你只需要服务端向手机同步,不需要手机向服务端同步的话(也就是手机端没有主动更新,只是被动接受更新)
    那就直接用版本更新的方案来做嘛
    sprinter
        7
    sprinter  
    OP
       2020-11-05 10:42:53 +08:00
    @janus77 对, 大哥 手机是被动更新, 请问"版本更新的方案"是指什么样的方案, 网上有类似现成的吗? 谢谢
    ritaswc
        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
    ritaswc
        9
    ritaswc  
       2020-11-05 10:52:50 +08:00
    这样做也方便你上 cdn 呀,cdn 同名文件更新内容很麻烦的哦
    acidsweet
        10
    acidsweet  
       2020-11-05 10:53:27 +08:00
    Git Diff 的思路吧,如果你本地不会去修改文件数量和内容,那 client--[commit_id]-->server 后服务端计算两者 diff,下发这部分文件让 client 覆盖就行;但是如果本地会修改的话,如果允许冗余,引入工作去和本地仓库的概念,先 git rest 工作区然后再 git pull ;如果不允许冗余,那比较麻烦了,可以先本地检查文件是不是被修改过,哪些被修改过然后将 commit_id 和这部分信息都给服务端由服务端决策需要更新的部分
    Arthur5
        11
    Arthur5  
       2020-11-05 17:34:29 +08:00
    这一批文件有一个版本号,任何文件改动一次版本号加 1,版本之间有差异的文件记录下来。手机每次只比较本地版本号与服务器版本号,版本号不同就把有差异文件下回来覆盖就行了
    flynaj
        12
    flynaj  
       2020-11-07 08:21:08 +08:00 via Android
    简单的比较一下文件时间大小就行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:59 · PVG 18:59 · LAX 02:59 · JFK 05:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.