全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网

同步数据

更新时间:2017-08-02 20:43:07   分享:   

数据获取方式

智能云相册按时间维度来管理数据,支持以类似Java中的迭代子模式来分批返回数据。

客户端在获取数据(比如获取照片、相簿、人脸、时光和标签列表等)时,需要提供以下几个参数:

  • Cursor:游标,其中包含有时间戳信息。初次获取数据,可以使用0来表示最小游标;使用当前时间戳(精确到毫秒)来表示最大的游标。
  • Direction: 获取数据的方向,可选值为forward,backward。当取值为forward时,获取比游标中的时间戳较新的数据。当取值为backward时获取比游标中的时间戳较老的数据
  • Size:表示本次请求最多返回多少条记录

智能云相册除返回业务数据以外,还会返回NextCursor。它的取值为:

  • 如果有数据返回,NextCursor为下次获取数据的基准游标,客户端可以使用这个游标继续获取数据。
  • 如果没有数据返回,NextCursor为EOF。

举例说明:

query_data1

  • 用户在t0时刻开始上传第1-5这5张照片,t1时刻完成上传,
  • 在t2时刻上传了6-9这4张照片,在t3时刻完成上传。此时该用户总共9张照片。

从图中可以直观地看到,如果在t1-t2之间的某时刻获取数据时

  • 如果Direction为forward,将获取到比其更新的数据,也就是第6-9张照片;
  • 如果Direction为backward,将获取到比其更老的数据,也就是第1-5张照片。

具体来讲,客户端在获取这些照片时有以下几种方式:

从老数据开始全量获取

第一次请求:

  • 请求参数为Cursor = '0', Direction = 'forward', size = 5
  • 响应:第1-5张照片,NextCursor = t1;

第二次请求

  • 请求参数Cursor = t1, Direction = 'forward', size = 5
  • 响应:第6-9张照片,NextCursor = t3;

第三次请求

  • 请求参数Cursor = t3, Direction = 'forward', size = 5
  • 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。
  • 注1:如果在第一次请求时指定的size=10,那么在第一次请求中就可以返回所有数据。
  • 注2:这里为了理解方便,将响应中的NextCursor设置为t1或者t3,不代表实际值就是t1或t3。

从新数据开始全量获取

第一次请求:

  • 请求参数为Cursor = '<当前时间戳>', Direction = 'backward', size = 5
  • 响应:第5-9张照片,NextCursor = t1;

第二次请求

  • 请求参数Cursor = t1, Direction = 'backward', size = 5
  • 响应:第1-4张照片,NextCursor = t0;

第三次请求

  • 请求参数Cursor = t0, Direction = 'backward', size = 5
  • 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。

增量获取

增量获取主要用于不同客户端之间同步数据,比如自动将手机上拍摄的照片同步到平板电脑。增量获取数据时,客户端只需在获取数据后将服务端返回的NextCursor保存起来,下次同步数据的时候将其作为Cursor即可获取到更新的数据。

我们依然以上面的图为例,只是请求的时序有所不同:

  1. 客户端A在t0时刻上传了第1-5这5张照片
  2. 客户端B在t1-t2之间的某个时刻开始同步数据

    • 第一次请求:参数为Cursor = '0', Direction = 'forward', size = 5;返回第1-5条数据和NextCursor = t1;此时客户端需要将NextCursor的值t1保存下来。注:发送第一次请求时,客户端B本地没有缓存过的Cursor,所以它以0为Cursor开始发送请求。
    • 第二次请求:参数为Cursor = t1, Direction = 'forward', size = 5;无数据返回,NextCursor = EOF。此时,客户端不更改本地缓存的NextCursor值(依然为t1)。
  3. 客户端A在t2时刻又上传了4张照片
  4. 客户端B在t3时刻之后的某个时刻开始同步数据

    • 由于第2步中客户端B在本地记录了上次同步的Cursor = t1,故本次同步请求的参数为Cursor = t1, Direction = 'forward', size = 5,返回第6-9条数据。

在这个例子中,第4步返回的都是新增的记录。在实际的场景中,客户端A也可能在t1-t2之间删除某些之前上传的照片。客户端B在同步数据时,服务端也会返回删除的记录,这样客户端B就可以在本地删除掉客户端A删除的那些记录。

实现增量同步的关键点

  • 客户端从智能云相册服务端获取数据后,需要将数据缓存在本地。
  • 如果服务端返回的NextCursor不是EOF,则将NextCursor保存起来作为后续请求中的Cursor参数。
  • 客户端根据服务端返回的数据调整本地缓存,比如新增或者删除本地缓存中的记录。
  • 客户端在请求数据时,需要告知服务端它需要获取所有状态的记录。
  • 如果由于某些原因客户端本地的缓存被清理了,则需要拉取数据重建本地缓存。

示例代码

请参考利用SDK来实现分批获取数据的示例代码。

本文导读目录
本文导读目录
以上内容是否对您有帮助?