本文为您介绍表格存储的数据版本以及生命周期功能,数据版本以及生命周期可以帮助您有效的管理数据。

版本号

每次更新属性列的值都会为该值生成一个新版本,版本的值即为版本号(时间戳)。在写入数据时,您可以自定义属性列的版本号。如果不指定版本号,表格存储会默认将当前时间的毫秒单位时间戳(从 1970-01-01 00:00:00 UTC 计算起的毫秒数)作为属性列生成版本号。

版本号的单位为毫秒,在进行 TTL 比较和有效版本偏差计算时,需要除以 1000 换算成秒。版本号主要可以实现以下功能:

  • 数据的生命周期(TTL)

    版本号可以定义数据表的生命周期。例如属性列版本号为 1468944000000 (即 2016-07-20 00:00:00 UTC),当数据表的 TTL设置为 86400 (一天)时,该版本的数据将会在 2016-07-21 00:00:00 UTC 过期,随后会被后台系统自动删除。

    当数据的版本号完全由服务端决定时,写入的数据在写入后经过设置的 TTL 后会被系统清理。

  • 每行数据的版本读取

    读取一行数据时,可以指定每列最多读取多少版本或者读取的版本号范围。

最大版本数

最大版本数(Max Versions)表示该数据表中的属性列能够保留多少个版本的数据。当一个属性列的版本个数超过 Max Versions 时,最早的版本将被异步删除。

在创建数据表时,您可以自定义属性列的最大版本数。建表后,您也可以通过 UpdateTable 接口动态更改数据表的 Max Versions。

说明
  • 超过 Max Versions 的数据版本为无效数据,即使数据还没有被真正删除,该数据对用户已经不可见,无法读出。
  • 当调小 Max Versions 时,如果数据版本个数超过新设的 Max Versions,最早的版本会被系统异步删除。
  • 当调大 Max Versions 时,如果以前版本个数超过旧的 Max Versions 还没有被系统删除,数据会被重新读出来。

有效版本偏差

有效版本偏差(Max Version Offset)是您指定的数据版本号与系统当前时间偏差的允许最大值,单位为秒。如果用户写入的时间戳非常小,与当前时间偏差已经超过了表上设置的 TTL 时间,写入的数据会立即过期。设置 Max Version Offset 可以避免这种情况。

为了保证数据写入成功,表格存储在处理写请求时会对属性列的版本号进行检查。属性列的有效版本范围为:[数据写入时间 - 有效版本偏差,数据写入时间 + 有效版本偏差)。属性列版本号为毫秒,其除以 1000 换算成秒之后必须属于这个范围。如果当版本不属于这个范围,该行数据写入失败。

例如,当数据表的有效版本范围为 86400 (一天),在 2016-07-21 00:00:00 UTC 时,只能写入版本号大于 1468944000000 (换算成秒之后即 2016-07-20 00:00:00 UTC)并且小于 1469116800000 (换算成秒之后即 2016-07-22 00:00:00 UTC)的数据。当某一行的某个属性列版本号为 1468943999000 (换算成秒之后即 2016-07-19 23:59:59 UTC)时,该行数据写入失败。

指定有效版本偏差时,注意以下几点:
  • 建数据表时,用户若不设置有效版本偏差,将使用默认值 86400。

  • 建表后,可以通过 UpdateTable 接口动态更改有效版本偏差。

  • 有效版本偏差为非 0 值,可以大于 1970-01-01 00:00:00 UTC 时间到当前时间的秒数。

数据生命周期

数据生命周期(Time To Live,简称 TTL)是数据表的一个属性,即数据的存活时间,单位为秒。表格存储会在后台对超过存活时间的数据进行清理,以减少用户的数据存储空间,降低存储成本。

例如,一个数据表的 TTL 设置为 86400 (一天),在 2016-07-21 00:00:00 UTC 时,该数据表上所有版本号小于 1468944000000 (除以 1000 换算成秒之后即 2016-07-20 00:00:00 UTC)的属性列都将过期,系统会自动清理这些过期的数据。

说明
  • 超过 TTL 的过期数据为无效数据,即使数据还没有被真正删除,该数据对用户已经不可见,无法读出。
  • 当调小 TTL 时,可能会有数据因为 TTL 变小而过期,这部分数据会被系统异步删除。
  • 当调大 TTL 时,如果有版本号在上个 TTL 之外的数据还没有被系统删除,数据会被重新读出。
  • 如果希望数据永不过期,将TTL设置为 -1。
  • 建表后,可以通过 UpdateTable 接口动态更改 TTL。