根据 rsync 算法,客户端将文件分块,计算两种 hash 值,然后发送给服务端,然后服务端会返回一个列表,表示新的文件的分块情况,有可能是直接引用原文件的某一块,也有可能是新的数据。
那么如果是引用原文件的某一块,原文件在分块的时候要把每一块内容先缓存起来比较好,还是等到需要用到的时候再从某某字节开始读取一块比较好?
1
wakzz 2020-10-09 10:18:52 +08:00 1
这里就是缓存的方案了,缓存肯定是要缓存的,现在主流两种缓存策略:
1. 软件本身不管理缓存,缓存由操作系统的文件系统管理,典型案例是 Elasticsearch,优点是减少了很多工作量,缺点也很明显,自己不管理缓存,热点数据的缓存容易被冷数据的缓存覆盖 2. 软件管理缓存,典型案例是 mysql 的 innodb 引擎,所有缓存加载在软件的堆内存内,优点是缓存管理由自己处理,通过各种策略防止热点数据缓存被冷数据缓存覆盖,缺点是有很多额外工作量,还需要预防 OOM |
2
wakzz 2020-10-09 10:22:55 +08:00 1
另一个问题就是版本控制的细节了,可以去了解一下 git 的实现,简单来说就是提交时间+版本号,版本新旧比较很简单了,真正麻烦的是版本冲突后的处理。
|