zoukankan      html  css  js  c++  java
  • 同步策略选择

    转自: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
    客户端收到响应

    客户端直接进行物理删除

    服务端删除记录

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

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/huangzp1104/p/9394358.html
Copyright © 2011-2022 走看看