请教一个关于分块存储文件同步的问题

2020-10-09 09:10:52 +08:00
 zxCoder

根据 rsync 算法,客户端将文件分块,计算两种 hash 值,然后发送给服务端,然后服务端会返回一个列表,表示新的文件的分块情况,有可能是直接引用原文件的某一块,也有可能是新的数据。

那么如果是引用原文件的某一块,原文件在分块的时候要把每一块内容先缓存起来比较好,还是等到需要用到的时候再从某某字节开始读取一块比较好?

571 次点击
所在节点    问与答
4 条回复
wakzz
2020-10-09 10:18:52 +08:00
这里就是缓存的方案了,缓存肯定是要缓存的,现在主流两种缓存策略:
1. 软件本身不管理缓存,缓存由操作系统的文件系统管理,典型案例是 Elasticsearch,优点是减少了很多工作量,缺点也很明显,自己不管理缓存,热点数据的缓存容易被冷数据的缓存覆盖
2. 软件管理缓存,典型案例是 mysql 的 innodb 引擎,所有缓存加载在软件的堆内存内,优点是缓存管理由自己处理,通过各种策略防止热点数据缓存被冷数据缓存覆盖,缺点是有很多额外工作量,还需要预防 OOM
wakzz
2020-10-09 10:22:55 +08:00
另一个问题就是版本控制的细节了,可以去了解一下 git 的实现,简单来说就是提交时间+版本号,版本新旧比较很简单了,真正麻烦的是版本冲突后的处理。
zxCoder
2020-10-09 16:22:10 +08:00
@wakzz 想请教一个问题,如果保证服务端的文件是最新的,那客户端想把这个最新的文件拉下来,要怎么判断应该是完全覆盖的更新,还是要解决冲突呢?这点一直想不太明白
zxCoder
2020-10-09 16:33:08 +08:00
@wakzz 我目前的简单理解是,如果本地的文件修改时间**早于**服务端的文件修改时间,那文件直接拉下来然后覆盖,如果**晚于**服务端,说明本地的文件在更新到最新版本之前就进行了修改,所以这时候再拉下来就会冲突,就需要解决冲突了。不知道这种理解对不对

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

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

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

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

© 2021 V2EX