秒传的原理

在本文中,我们将介绍网盘秒传的基本原理和实现方法,以及秒传的优缺点和应用场景。

网盘秒传的基本原理

网盘秒传的基本原理是利用哈希算法(如MD5或SHA-1)对文件进行特征值提取,然后与服务器上已有的文件特征值进行比对,如果发现相同的特征值,就说明服务器上已经存在相同的文件,无需再上传文件内容,只需建立一个文件链接即可实现秒传。这样可以节省上传时间和网络带宽,提高用户体验。

网盘秒传的实现方法

网盘秒传的实现方法一般分为以下几个步骤:

  1. 客户端在上传文件之前,先使用哈希算法对文件进行特征值提取,得到一个短字符串(如32位或40位)作为文件的唯一标识。
  2. 客户端将文件特征值发送给服务器,请求秒传。
  3. 服务器在收到文件特征值后,先在数据库中查询是否已经存在相同的特征值,如果存在,就返回一个成功的响应,并告知客户端文件链接的位置;如果不存在,就返回一个失败的响应,并要求客户端继续上传文件内容。
  4. 客户端根据服务器的响应,如果成功,就直接显示上传完成,并获取文件链接;如果失败,就按照正常的流程上传文件内容,并等待服务器返回文件链接。

网盘秒传的优缺点

网盘秒传的优点有:

  • 节省上传时间和网络带宽,提高用户体验。
  • 减少服务器的存储空间和计算资源消耗,提高服务器性能。
  • 避免重复存储相同的文件,节约存储空间。

网盘秒传的缺点有:

  • 需要客户端和服务器之间进行额外的通信,增加网络开销。
  • 需要客户端对文件进行哈希计算,增加客户端的计算开销。
  • 需要服务器维护一个文件特征值的数据库,增加服务器的管理开销。
  • 可能存在哈希冲突的风险,导致误判或数据丢失。
  • 可能存在隐私泄露或版权侵权的风险,因为任何人只要知道文件特征值就可以获取文件内容。

网盘秒传的应用场景

网盘秒传适用于以下几种应用场景:

  • 文件内容不变化或变化很小的情况,如文档、图片、音乐、视频等。
  • 文件内容具有高度重复性或公共性的情况,如软件安装包、系统镜像、电子书籍等。
  • 文件内容不涉及隐私或版权敏感信息的情况,如公开资料、开源代码、免费资源等。

总结

网盘秒传是一种利用哈希算法对文件进行特征值提取和比对的技术,可以实现在不上传文件内容的情况下完成文件上传。它具有节省时间和带宽、减少存储空间和计算资源消耗等优点,但也存在网络开销、计算开销、管理开销、哈希冲突、隐私泄露等缺点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于go的大文件切片上、断点续.zip 1、如何唯一标示一个文件? 文件的信息后端会存储在mysql数据库表中。 在上之前,前端通过 spark-md5.js 计算文件的md5值以此去唯一的标示一个文件。 spark-md5.js 地址:satazor/js-spark-md5 README.md中有spark-md5.js的使用demo,可以去看看。 2、断点续是如何实现的? 断点续可以实现这样的功能,比如RD上200M的文件,当用户上完199M时,断网了,有了断点续的功能,我们允许RD再次上时,能从第199M的位置重新上。 实现原理: 实现断点续的前提是,大文件切片上。然后前端得问后端哪些chunk曾经上过,让前端跳过这些上过的chunk就好了。 前端的上器(uploader.js)在上时会先发送一个GET请求,这个请求不会携带任何chunk数据,作用就是向后端询问哪些chunk曾经上过。 后端会将这些数据保存在mysql数据库表中。比如按这种格式:1:2:3:5表示,曾经上过的分片有1,2,3,5。第四片没有被上,前端会跳过1,2,3,5。 仅仅会将第四个chunk发送给后端。 3、是如何实现的? 实现的功能是:当RD重复上一份相同的文件时,除了第一次上会正常发送上请求后,其他的上都会跳过真正的上,直接显示成功。 实现方式: 后端存储着当前文件的相关信息。为了实现,我们需要搞一个字段(isUploaded)表示当前md5对应的文件是否曾经上过。 后端在处理 前端的上器(uploader.js)发送的第一个GET请求时,会将这个字段发送给前端,比如 isUploaded = true。前端看到这个信息后,直接跳过上,显示上成功。 4、上暂停是如何实现的? 上的暂停:并不是去暂停一个已经发送出去的正在进行数据输的http请求~ 而是暂停发送起发送下一个http请求。 就我们的项目而言,因为我们的文件本来就是先切片,对于我们来说,暂停文件的上,本质上就是暂停发送下一个chunk。 5、前端上并发数是多少? 前端的uploader.js中默认会三条线程启动并发上,前端会在同一时刻并发 发送3个chunk,后端就会相应的为每个请求开启三个协程处理上的过来的chunk。 在我们的项目中,会将前端并发数调整成了1。原因如下: 因为考虑到了断点续的实现,后端需要记录下曾经上过哪些切片。(这个记录在mysql的数据库表中,以 ”1:2:3:4:5“ )这种格式记录。 Mysql5.7默认的存储引擎是innoDB,默认的隔离级别是RR。如果我们将前端的并发数调大,就会出现下面的异常情况: 1. goroutine1 获取开启事物,读取当前上到记录是 1:2 (未提交事物) 2. goroutine1 在现有的记录上加上自己处理的分片3,并和现有的1:2拼接在一起成1:2:3 (未提交事物) 3. goroutine2 获取开启事物,(因为RR,所以它读不到1:2:3)读取当前上到记录是 1:2 (未提交事物) 4. goroutine1 提交事物,将1:2:3写回到mysql 5. goroutine2 在现有的记录上加上自己处理的分片4,并和现有的1:2拼接在一起成1:2:4 (提交事物) 可以看到,如果前端并发上,后端就会出现分片丢失的问题。 故前端将并发数置为1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值