Skip to main content

moregeek program

如何实现高效上传?文件增量同步机制了解一下_wx612751f2ed44d的博客-多极客编程

前言

近期,公司的云盘项目即将完成内测,这次给大伙分享一下在本地编辑保存这一场景下,用到的增量同步机制。


场景说明

首先,本地编辑的场景如下:

1、从服务端下载文件到本地;
2、使用本地应用程序打开文件进行编辑修改;
3、保存时,把文件修改内容同步到服务端;
4、再次编辑保存,再次把文件修改内容同步到服务端;

假设,这里的文件是 word 之类的格式,那么文件本身不大,整个上传占用的带宽少,时间也快。但如果,编辑的是 CAD 之类的文件,文件大小可以去到几百兆,那么占用带宽多,上传时间也随之变长。

但是,一个文件实际上是一长串的字节数据,我们可以把它分割成一块块来看。文件修改时,只会对其中一部分字节数据有所修改调整,其他大部分字节数据都不会改变。

因此,通过计算对比旧文件,可以让服务端自行复制大部分内容相同的文件字节块,客户端只针对修改过的字节块进行上传即可,这样一来,上传时间将大大缩短。


原理及操作步骤

具体的原理及步骤如下:

1、服务端以 500KB(步长根据文件大小情况调整)作为步长,把原文件进行分割,分别计算其 Alder32值(弱哈希)和 MD5值(强哈希);

2、客户端把从服务端拿到的弱哈希值作为 key,强哈希值和块号作为值,构建出 map 映射表;

3、客户端对新文件字节数据,用同样的步长和滑动窗口计算哈希值。
(1)若弱哈希值存在,随后对比强哈希值,强哈希值也匹配,则认为文件块在原文件存在,请求服务器对新文件写入原文件中的指定文件块。
(2)若弱哈希值不存在,或者强哈希值不一致,则右移一位字节再计算,直到遇到存在的块,则把前面的字节上传到服务端写入新文件。
(3)直到把新文件字节数据全部遍历计算完成。

如何实现高效上传?文件增量同步机制了解一下_增量同步

最终在服务端,会得到这样的一个数据数组。

如何实现高效上传?文件增量同步机制了解一下_文件上传_02

图中,红色块表示在原文件已匹配上,不用传输。而白色块就是需要传输的内容,服务端会根据这些数据块重新生成新的文件。

通过只对变更的部分进行传送,其他相同文件块由服务端去复制写入,能大大减少数据的传输和加快大文件的上传速度。

对于像 CAD 等大文件编辑保存同步的场景下,尤为有效。


以上就是本期分享,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!

©著作权归作者所有:来自51CTO博客作者博读代码的原创作品,请联系作者获取转载授权,否则将追究法律责任

工厂方法在spring源码中的运用_程序员田同学的博客-多极客编程

我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的。 在上篇文章中我们懂了什么是工厂模式,这篇文章就带着学过的概念深入到Spring的内部看看究竟是怎么使用该模式的。 在Spring中使用工厂方法的是BeanFactory和FactoryBean<>接口。 一、BeanFactory使用工厂方法 使用

设计模式之访问者模式_程序员田同学的博客-多极客编程

大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时候是不可或缺的,这篇文章就开始学习最后一个设计模式——访问者模式。 一、概念理解 访问者模式概念:封装作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 通俗的解释就是,系统中有一些固定结构的对象(元素),在其内

十分钟速成devops实践_华为云开发者社区的博客-多极客编程

摘要:以华为云软件开发平台DevCloud为例,十分钟简单体验下DevOps应用上云实践——H5经典小游戏上云。本文分享自华为云社区《​​《DevOps实践秘籍》十分钟速成DevOps实践​​》,作者:AppCloud小助手 。DevOps是什么?DevOps是Development和Operations的组合词,简单点理解就是研发运维一体化的方法论,目的是通过自动化“软件交付”和“架构变更”的流

6步搭建一个飞机大战游戏_华为云开发者社区的博客-多极客编程

摘要:本文以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。DevOps实践DevOps实践是一种开发、测试运维一体化的模式,其实践的外在表现一般包括了如代码仓库、构建、测试、发布、配置、监控等工具形成的一个完整的工具链或者说开发平台,以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。​​实践手册下载>>>​

stampedlock:一个并发编程中非常重要的票据锁_华为云开发者社区的博客-多极客编程

摘要:一起来聊聊这个在高并发环境下比ReadWriteLock更快的锁——StampedLock。本文分享自华为云社区《​​【高并发】一文彻底理解并发编程中非常重要的票据锁——StampedLock​​》,作者: 冰 河 。什么是StampedLock?ReadWriteLock锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不允许另外的线程多共享变量进行写操作,更多的适合于读多写少的环

实例分析scheduled thread pool executor与timer的区别_华为云开发者社区的博客-多极客编程

摘要:JDK 1.5开始提供Scheduled Thread PoolExecutor类,Scheduled Thread Pool Executor类继承Thread Pool Executor类重用线程池实现了任务的周期性调度功能。本文分享自华为云社区《​​【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例​​》,作者:冰 河 。JDK 1.5开始提供

执行冒烟测试的前提_多测师11的博客-多极客编程

  由于冒烟测试特别关注更改过的代码,因此必须与编写代码的开发人员协同工作。必须了解以下内容:  1.代码中进行了什么更改。若要理解该更改,必须理解使用的技术;开发人员可以提供相关说明。  2.更改对功能有何影响。  3.更改对各组件的依存关系有何影响。  在进行冒烟测试前检查代码  在运行冒烟测试前,进行侧重于代码中的所有更改的代码检查。代码检查是验证代码质量并确保代码无缺陷和错误的最有效、最经

互联网的前世今生-web1.0到web3.0的巨变_gavin学产品的博客-多极客编程

众所周知,互联网在短短的数十年中,发展飞快,已经深入到我们生活的方方面面,国内外近些年的福布斯富豪榜上,很多都是做互联网的。那么互联网究竟为何发展如此快呢?接下来让我们来一探究竟。一、计算机是如何一步步演变来的?1889年,美国科学家 ​​赫尔曼·何乐礼​​ 研制出以电力为基础的电动制表机,用以储存计算资料。1930年,美国科学家 ​​范内瓦·布什​​ 造出世界上首台模拟电子计算机。1946年2月

工厂方法在spring源码中的运用_程序员田同学的博客-多极客编程

我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的。 在上篇文章中我们懂了什么是工厂模式,这篇文章就带着学过的概念深入到Spring的内部看看究竟是怎么使用该模式的。 在Spring中使用工厂方法的是BeanFactory和FactoryBean<>接口。 一、BeanFactory使用工厂方法 使用

6步搭建一个飞机大战游戏_华为云开发者社区的博客-多极客编程

摘要:本文以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。DevOps实践DevOps实践是一种开发、测试运维一体化的模式,其实践的外在表现一般包括了如代码仓库、构建、测试、发布、配置、监控等工具形成的一个完整的工具链或者说开发平台,以华为云软件开发平台DevCloud为例,展示飞机大战游戏开发的DevOps实践流程。​​实践手册下载>>>​

stampedlock:一个并发编程中非常重要的票据锁_华为云开发者社区的博客-多极客编程

摘要:一起来聊聊这个在高并发环境下比ReadWriteLock更快的锁——StampedLock。本文分享自华为云社区《​​【高并发】一文彻底理解并发编程中非常重要的票据锁——StampedLock​​》,作者: 冰 河 。什么是StampedLock?ReadWriteLock锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不允许另外的线程多共享变量进行写操作,更多的适合于读多写少的环

实例分析scheduled thread pool executor与timer的区别_华为云开发者社区的博客-多极客编程

摘要:JDK 1.5开始提供Scheduled Thread PoolExecutor类,Scheduled Thread Pool Executor类继承Thread Pool Executor类重用线程池实现了任务的周期性调度功能。本文分享自华为云社区《​​【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例​​》,作者:冰 河 。JDK 1.5开始提供