时间:2021-07-01 10:21:17 帮助过:6人阅读
我自己来吧
把当前数据序号(这里就用id)的最大值传给app,app记录下来
一开始A和B同时进行更新,他俩都是10
更新的时候,给服务器发数据序号(这里就用id)这个过去,服务器通过select * from XXX where id >= app本地数据序号进行查询
A更新的时候(从10条变成了15条)那么当前这个id是15;B没进行更新,他还是10;
再次更新的时候,同理,服务器只会给A发送16到20的数据,对于B服务器发送11到20的数据,让他们增量更新
针对于简单的逻辑(只是对数据的新增),上面的部分已经解决了
但这里又出现一个新问题,服务器的数据进行更改或者标记删除?怎么办?
那么你需要看下面的处理:
新增一个字段mark一开始设置为0
一开始A和B同时进行更新(都更新了10条数据),把mark为0的都更新过去了,本地的mark为0
现在对表中的数据更新(从10到15),对里面的某条数据进行修改(第3条),对第5条进行删除(标记为-1);现在服务器的数据mark标记10到15的为1(1到10的还是不变为0)
A进行了更新(从10到15),他本地的mark变成了1;B没更新mark本地还是0;
服务器的数据再次更新(从15到20)
这时A和B都更新,A给服务器传mark的值为1,服务器查找比mark大的标记(15到20条数据)发给A;同理,给B发送mark大于0的标记(10到20条数据);他俩也能达到差异更新
现在来看看上面的,如果对数据进行修改了,怎么办?
假如上面所说的服务器对第3条数据进行了修改,那么我们约定mark+2为修改的,app在碰到mark+2的,就要对这条数据进行更新,具体更新客户端来做;同样标记删除的,我们约定为-1,那是标记不显示出来;
现在问题又来了
假如目前服务器的mark标记已经达到了5000,一个app他从未更新,现在还是0(类似情况也适用于新安装的客户端);那么他需要同时更新到5000(可能数据有十来万),这怎么办?
所以要加一个限定,我们假设app上传本地mark的时候,服务器判断,他和服务器中最大的mark相差超过50,我们只给其发送最大-50的数据(用在这里就是4950到5000的数据列),这样就减少了客户端的压力
那么,可能就要问了,期间的数据怎么办?
首选丢弃。。第二选择,可以选择一个小版本,对这部分的处理。
不过参考微信和qq的数据,他们也是对这部分进行删除的,我们还给她保留可点。。