• 同步策略选择


    转自:https://blog.csdn.net/coder_ken/article/details/50920606

    名词解释

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

    客户端表设计

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

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

    服务端表设计

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

    双向同步过程

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

    idnamephonestatusanchor
    1 Ken 18612345678 9 2
    2 Jim 13888888888 9 3

    服务端:

    idnamephonemodified
    1 Ken 18612345678 2
    2 Jim 13888888888 3

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

    Client增加1条记录

    idnamephonestatusanchor
    1 Ken 18612345678 9 2
    2 Jim 13888888888 9 3
    3 Tim 12345678 0 0

    Client修改1条记录

    idnamephonestatusanchor
    1 Ken 18612345678 9 2
    2 Jim 010-12345678 1 3
    3 Tim 12345678 0 0

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

    Client发送本地更新

    SELECT * FROM table WHERE status < 9
    • 1

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

    idnamephonestatusanchor
    2 Jim 010-12345678 1 3
    3 Tim 12345678 0 0

    Server处理同步消息

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

    idnamephonestatusanchor
    2 Jim 010-12345678 1 3

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

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

    其次,处理第二条数据

    idnamephonestatusanchor
    3 Tim 12345678 0 0

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

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

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

    idnamephonemodified
    1 Ken 18612345678 2
    2 Jim 010-12345678 6
    3 Tim 12345678 8

    Client根据响应更新本地记录

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

    idstatusanchor
    2 9 6
    3 9 8

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

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

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

    idnamephonestatusanchor
    1 Ken 18612345678 9 2
    2 Jim 010-12345678 9 3->6
    3 Tim 12345678 9 0->8

    Server增加一条数据并更新一条数据

    idnamephonemodified
    1 Ken 00000000 11
    2 Jim 010-12345678 6
    3 Tim 12345678 8
    4 Bill 88888888 10

    Client向Server请求数据

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

    SELECT * FROM table WHERE modified > Max(anchor)
    • 1

    返回下表中的数据:

    idnamephonemodified
    1 Ken 00000000 11
    4 Bill 88888888 10

    Client处理同步消息

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

    idnamephonestatusanchor
    1 Ken 00000000 9 2->11
    2 Jim 010-12345678 9 6
    3 Tim 12345678 9 8
    4 Bill 88888888 9 10

    客户端删除记录

    逻辑删除记录
    idnamephonestatusanchor
    1 Ken 00000000 -1 15
    2 Jim 010-12345678 9 6
    3 Tim 12345678 9 8
    4 Bill 88888888 9 10
    客户端发送消息到服务端

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

    idnamephonemodified
    1 Ken 00000000 16
    服务端响应客户端的请求
    idstatusanchor
    1 -1 16
    客户端收到响应

    客户端直接进行物理删除

    服务端删除记录

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

  • 相关阅读:
    python目录
    面向对象
    模块(二)
    python函数(四)
    助教工作总结
    第五次个人作业:个人总结
    Typroa编写的图片上传博客园
    msfconsole利用ms17-010和ms12-020攻击
    第四次个人作业——案例分析
    助教周报(第二轮)
  • 原文地址:https://www.cnblogs.com/huangzp1104/p/9394358.html
Copyright © 2020-2023  润新知