Android客户端与服务器端数据同步

应用场景

假设我们在做一个通讯录软件,我们可以在多个客户端对服务端的数据进行增删改。那么这篇文章中我们要解决的问题是如何在客户端与服务端只传输经过增删改操作的数据,来使得客户端与服务端的数据是同步的。

名词解释

Anchor:同步锚点,用时间戳来表示,用来发现两端数据变化的部分

客户端表设计

每条记录包含两个用来同步用的字段:
status : 用来标识记录的状态
anchor : 记录服务端同步过来的时间戳

anchor含义
0本地新增
-1标记删除
1本地更新
9已同步

服务端表设计

modified : 服务端修改记录的时间戳

双向同步过程

初始状态下,我们假设客户端和服务端的表各有两条数据
客户端:

idnamephonestatusanchor
1Ken1861234567892
2Jim1388888888893

服务端:

idnamephonemodified
1Ken186123456782
2Jim138888888883

此时,客户端与服务端的数据是完全同步好了的

Client增加1条记录
idnamephonestatusanchor
1Ken1861234567892
2Jim1388888888893
3Tim1234567800
Client修改1条记录
idnamephonestatusanchor
1Ken1861234567892
2Jim010-1234567813
3Tim1234567800

:因为上面的数据不是从服务端同步过来的,所以anchor默认为0

Client发送本地更新
SELECT * FROM table WHERE status < 9

客户端执行上面的SQL语句,找出客户端需要同步到服务端的记录。通过网络串行的发送给服务端。上一条请求没有得到回应的话,就不能进行下一个请求。
下表中的数据是发送的同步消息

idnamephonestatusanchor
2Jim010-1234567813
3Tim1234567800
Server处理同步消息

服务端串行的收到客户端发送过来的数据,首先处理第一条数据

idnamephonestatusanchor
2Jim010-1234567813

服务端收到请求后需要对比客户端的anchor和服务端的modified,只有服务端modified=客户端anchor才能继续同步,否则说明客户端在上一次同步后服务端更新过数据,需要解决冲突后才能继续,接着根据status的值为1,那么服务端执行UPDATE语句

UPDATE table SET (name, phone) VALUES (?, ?) WHERE id = ?

其次,处理第二条数据

idnamephonestatusanchor
3Tim1234567800

如果得知anchor = 0,直接执行INSERT 语句

INSERT INTO table (id, name, phone) VALUES(?, ?, ?)

服务端经过这两次操作后,数据表如下

idnamephonemodified
1Ken186123456782
2Jim010-123456786
3Tim123456788
Client根据响应更新本地记录

服务端处理完数据后,还要响应客户端的请求,如下

idstatusanchor
296
398

收到响应后,客户端就开始执行UPDATE了

UPDATE table SET status = ?, anchor = ? WHERE id = ?

客户端现在的数据表如下:

idnamephonestatusanchor
1Ken1861234567892
2Jim010-1234567893->6
3Tim1234567890->8
Server增加一条数据并更新一条数据
idnamephonemodified
1Ken0000000011
2Jim010-123456786
3Tim123456788
4Bill8888888810
Client向Server请求数据

因为服务端modified字段代表的是时间戳,所以Max(anchor)表示客户端最近一次同步的时间,如果存在服务端modified > Max(anchor),说明服务端需要向客户端同步数据。
服务器端执行下面的SQL语句:

SELECT * FROM table WHERE modified > Max(anchor)

返回下表中的数据:

idnamephonemodified
1Ken0000000011
4Bill8888888810
Client处理同步消息

客户端根据增量数据更新本地表,处理数据时,只能更新状态为已同步或者不存在的数据

idnamephonestatusanchor
1Ken0000000092->11
2Jim010-1234567896
3Tim1234567898
4Bill88888888910
客户端删除记录
逻辑删除记录
idnamephonestatusanchor
1Ken00000000-115
2Jim010-1234567896
3Tim1234567898
4Bill88888888910
客户端发送消息到服务端

根据status < 9,将逻辑删除的记录发送至服务端,服务端收到消息后,将该记录移至deleted_table(相当于时光机,以后可以进行数据的恢复)表中

idnamephonemodified
1Ken0000000016
服务端响应客户端的请求
idstatusanchor
1-116
客户端收到响应

客户端直接进行物理删除

服务端删除记录

如果客户端从服务端获取的增量信息中包含删除记录的消息,则客户端直接进行物理删除

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值