1
zorceta 2013-06-28 23:04:00 +08:00
瞬间想起git
|
2
swulling 2013-06-28 23:06:26 +08:00
版本号,但版本号采用SHA1而不是简单的数字累加
然后有套合并和冲突解决的机制 |
3
refresh OP |
5
horsley 2013-06-28 23:17:24 +08:00 1
@swulling的意思其实就跟git一个道理
管理版本号,不是简单的递增,而是用sha1等哈希算法来做,行话是数据摘要(签名) 东西不一样,理论上签名就不会一样,所以就不存在你说的问题2,因为版本号的产生依据是数据内容 而不是修改的次数 时间确实不太靠谱,每个地方时钟不太一样 不一定说是用git,但是想起git是很正常的,他的思想可以借鉴 |
6
horsley 2013-06-28 23:20:33 +08:00
@refresh git的话,以我粗略的理解,版本控制对比并不需要读取所有数据,读取的是那个版本树,版本树是由数据签名连起来的,每次的commit相当于一次快照,实际的文件内容是另外存放的,版本树上的每个节点只是索引了有哪些文件而已,有不妥的地方还望高手指正
|
7
refresh OP |
8
fangzhzh 2013-06-28 23:24:24 +08:00
给你说一个我们的思路: 客户端保存一个modtime, 此字段保存上次访问服务器时, 从服务器上取下来的时间, 下次就直接那这个时间去要数据.
不用关心客户端的时间. |
9
refresh OP @horsley 实际上类似于每次同步读取索引,例如每次将一个表的id/version拉下来,再做比较,不知道我的理解对不。例如有一个todos表,里面可能有三万条数据,相当于每次同步都要将这三万条数据的id/version拖下来再比较。
|
10
horsley 2013-06-28 23:28:00 +08:00
@refresh merge的问题
如果你了解下git,你会发现git并不是存储整份文件的,文件变更的时候只会存差异的部分 也就是diff patch,这个方法可以解决很多问题,也就是旧的版本+变化部分patch过后一定能变成新版本。当然有些时候还是要人来解决冲突,这个没办法。 删除的问题这个有得讨论,这也是我不太放心各种同步工具的问题。 一般是这样理解的,一种叫做同步,一种叫做备份,简单理解,同步是双向的,也就是一边删了另外一边也会删掉。备份可以是单向的,只增不删。 当然实现起来这个删是真的删掉,还是有备份让用户可以还原,这是另外的问题 |
11
refresh OP |
13
fangzhzh 2013-06-28 23:34:53 +08:00
|
15
refresh OP @horsley 我觉得结合@fangzhzh 所说的服务器时间与版本,可能能解决大部分的问题。我现在想用一个相对比较简单的方案来解决问题,不希望太复杂。
删除的问题,客户端删除并不做真正的删除,而是加上一个标题,同步的时候先让服务器删除,确定服务器删除再删除本地。 服务器删除可以直接删除,客户端在同步的时候,如果发现本地有数据(非新建的情况),而服务器上没有这条数据,表示服务器已经被删除。 这种双向还不是真正的删除,同一条数据,客户端和服务器端都发生改变,真正的双向应该以最后更新的数据为准。但上面的讨论解决方案,都必需以服务器或者客户端的一个版本为准,而不是以时间为谁。 例如:服务器上的数据3:00 pm被修改,客户端的数据4:00pm被修改,数据之前都没有同步,这时候同步,应该是客户端覆盖服务器端的。但如果按版本号不同来同步数据,可能就是用服务器覆盖本地的了(也可能反之,但无法智能识别)。 |
18
laiwei 2013-06-28 23:46:03 +08:00 via Android 1
@horsley 你确定git 存储的是 旧版本 + diff,然后生成新版本?
我记得这个是svn的工作原理吧! git存储的都是整个文件,只不过如果两次commit中没有发生任何变化的文件始终只有一份。(发生变化的话才存两份) |
20
refresh OP @fangzhzh 用服务器时间有一个问题,假如客户端某一次更新,网络无法链接,取不到服务器的时间,在线的时候,如何处理?
|
22
fangzhzh 2013-06-29 00:10:06 +08:00
@fangzhzh 其实也用版本号, 不过版本号解释稍微复杂了些. 版本号是和具体的产品应用有关系的, 没有通用的. 我们的版本号,就是为了判定过期新闻.
|
24
zhigang1992 2013-06-29 22:33:49 +08:00
全部重新获取,有ETag呀。。。
|
25
refresh OP @zhigang1992 ETag只适合于RSS或者图片资源类,不适合restFul API吧
|