数据同步方案
一、数据库表设计
1、客户端表设计
每条记录包含两个用来同步用的字段:
status : 用来标识记录的状态
anchor : 记录服务端同步过来的时间戳
status 含义
0 本地新增
-1 标记删除
1 本地更新
9 已同步
2、服务端表设计
每条记录包含一个用来同步用的字段:
modified : 服务端修改记录的时间戳
二、同步方案
1、服务器下行同步方案
服务器新增数据同步到客户端
服务器删除数据(级联删除)同步到客户端
服务器更新数据,如果客户端未更新,则客户端数据同步,如果客户端更新,则不更新数据
2、服务器上行同步方案
客户端新增数据同步到服务器
客户端删除数据(级联删除)同步到服务端
客户端更新数据同步到服务端
三、同步算法
1、客户端请求最新数据,客户端取每张表中status==9的记录里面最新的数据,
参数数组
{
{
表名:
时间戳:
}
}
2、服务端响应数据,服务端查询时间戳大于每个表的时间戳的记录,将该记录返回,每个表返回一个集合,表顺序是主表在前,附表在后;表内记录顺序按时间戳升序排列!!
{
表名:表数据集合
}
3、客户端得到数据后,记录为新增则插入数据,记录为删除则删除数据,记录为更新判断客户端是否修改,如修改则部做任何操作,如未修改则改为服务器数据。,并将时间戳更新服务器时间戳,status更改为9
4、客户端将所有上传数据更新到服务端
{
表名:{}
}
5、服务端收到上传数据后,根据增删改状态更新服务器数据库,并将这些数据时间戳返回客户端
{
表名:{服务端id,时间戳,客户端id}
}
6、客户端收到数据后,根据id将时间戳插入数据库,,并将status更改为9。
四、服务端更新
修改时,插入时间戳,删除时,设置删除标识
五、客户端更新
修改时,将status更新下
更新时,只有当status=9 才修改status的值
六、图片同步过程
客户端定义图片表,包括图片id、图片路径、上传或者下载标识、图片状态。
服务器更新数据涉及图片的,将图片路径、图片id插入图片表,图片标识设置为下载。图片状态为待下载。
客户端更新数据涉及图片的,将图片路径、图片ID插入图片表,图片标识设置为上传。图片状态为待上传。
待数据更新完成后,查询图片表,上传待上传图片,下载待下载图片。
附:数据接口
1、客户端请求最新数据,客户端取每张表中status!=9的记录里面最新的数据,
参数数组
{
{
表名:
时间戳:
}
}
请求数据
POST 接口地址
相关数据库表:
参数
public class par{
string tableName ;
long timestame;
}
public class parResponse{
list<par> parList;
}
正确返回值
{
"meta": {
"success": true,
"message": "ok"
},
"data": $data
}
Data说明
Public class getDataRequest{
List<requestData> dataList;
}
public class requestData{
string tableName ;
list<string> dataList;
}
2、服务端响应数据,服务端查询时间戳大于每个表的时间戳的记录,将该记录返回,每个表返回一个集合,表顺序是主表在前,附表在后;表内记录顺序按时间戳升序排列!!
{
表名:表数据集合
}
3、客户端得到数据后,记录为新增则插入数据,记录为删除则删除数据,记录为更新判断客户端是否修改,如修改则部做任何操作,如未修改则改为服务器数据。,并将时间戳更新服务器时间戳,status更改为9
4、客户端将所有上传数据更新到服务端
{
表名:{}
}
5、服务端收到上传数据后,根据增删改状态更新服务器数据库,并将这些数据时间戳返回客户端,并将status更改为9
{
表名:{服务端id,时间戳,客户端id}
}
上传数据
POST 接口地址
相关数据库表:
参数
Public class uploadDataResponse{
List<requestData> dataList;
}
public class responseData{
string tableName ;
list<string> dataList;
}
正确返回值
{
"meta": {
"success": true,
"message": "ok"
},
"data": $data
}
Data说明
Public class getDataRequest{
List<requestData> dataList;
}
public class requestData{
string tableName ;
list< parData > dataList;
}
public class parData{
string serverId;
long timestamp;
string clientId;
}
6、客户端收到数据后,根据id将时间戳插入数据库。