数据版本和生命周期

使用数据版本以及数据生命周期(TTL)功能,您可以有效的管理数据,减少数据存储空间,降低存储成本。

最大版本数

最大版本数(Max Versions)表示数据表中的属性列能够保留数据的最大版本个数。当属性列中数据的版本个数超过设置的最大版本数时,系统会自动异步删除较早版本的数据。

重要

当前表格存储未限制最大版本数。但是出于性能与易用性考虑,建议控制版本数在500以内。

创建数据表时,如果未设置最大版本数,则系统会使用默认值1,您也可以自定义属性列的最大版本数。创建数据表后,您可以通过UpdateTable接口修改数据表的最大版本数。

超过最大版本数的数据版本为无效数据,即使系统还未删除数据,用户已无法读取对应数据。

  • 当调小最大版本数时,如果数据版本个数超过新设的最大版本数,系统会异步删除较早版本的数据。

  • 当调大最大版本数时,如果系统还未删除超过旧的最大版本数的对应版本数据,且对应版本数据在新设的最大版本数范围中,则对应版本的数据可以重新读取。

版本号

为数据表配置最大版本数后,当您每次更新属性列的值时,表格存储均会为该值生成一个新版本,版本的值即为版本号(时间戳),单位为毫秒。

在属性列中写入数据时,如果未设置版本号,则系统会自动生成数据的版本号,您也可以自定义数据的版本号。 由于版本号的单位为毫秒,在进行TTL比较和有效版本偏差计算时,需要除以1000换算成秒。

  • 当由系统自动生成数据的版本号时,系统默认将当前时间的毫秒单位时间戳(从1970-01-01 00:00:00 UTC计算起的毫秒数)作为属性列值的版本号。

  • 当自定义数据的版本号时,属性列值的版本号需要为64位的毫秒单位时间戳且在有效版本范围内。

使用版本号,您可以实现以下功能:

  • 数据生命周期(TTL)

    版本号可以用于定义数据表中属性列值的生命周期。当属性列中数据的保留时长超过设置的TTL后,系统会自动异步清理对应版本号的数据。

    例如数据的版本号为1468944000000(即2016-07-20 00:00:00 UTC+8),如果设置数据表的TTL86400(一天),则该版本号的数据会在2016-07-21 00:00:00 UTC+8过期,系统会自动异步删除该版本号的数据。

  • 每行数据的版本读取

    读取行数据时,您可以指定每列最多读取的版本个数或者读取的版本号范围。更多信息,请参见读取数据

数据生命周期

数据生命周期是数据表的一个属性,即数据的保存时间,单位为秒。当属性列中数据的保留时间超过设置的TTL时,系统会自动异步清理超过该属性列的数据。如果一行中所有属性列中数据的保留时间均超过了TTL,则系统会自动异步清理该行数据。

例如数据表的TTL设置为86400(一天),在2016-07-21 00:00:00 UTC+8时,数据表中所有版本号小于1468944000000(除以1000换算成秒后即2016-07-20 00:00:00 UTC+8)的属性列数据均会过期,系统会自动异步清理对应过期数据。

创建数据表时,如果未设置TTL,则系统会使用默认值-1(表示数据永不过期),您也可以自定义TTL。创建数据表后,您可以通过UpdateTable接口修改TTL。

重要

数据表的TTL和二级索引的TTL是独立的,且数据表的TTL必须大于等于二级索引的TTL。当数据表上存在二级索引且要修改数据表的TTL时,请根据实际情况进行操作。

  • 如果待设置的数据表的TTL小于其二级索引的TTL,请先使用SDK调用UpdateTable接口将二级索引的TTL修改为不大于目标值,再将数据表的TTL修改为目标值。

  • 如果待设置的数据表的TTL大于或等于二级索引的TTL,请直接将数据表的TTL修改为目标值。

超过TTL的过期数据为无效数据,即使系统还未删除数据,用户已无法读取对应数据。

  • 当调小TTL时,数据表中可能会有数据过期,系统会异步删除对应过期数据。

  • 当调大TTL时,如果系统还未删除在旧的TTL之外以前版本的数据,且对应版本数据在新设的TTL中,则对应版本的数据可以重新读取。

有效版本偏差

为了避免写入数据时,自定义的时间戳与当前时间的偏差超过了数据表的TTL,导致写入的数据立即过期的问题,您可以设置有效版本偏差。

有效版本偏差(Max Version Offset)是指定的数据版本号与系统当前时间偏差的允许最大值,单位为秒。有效版本偏差为正整数,可以大于1970-01-01 00:00:00 UTC时间到当前时间的秒数。

为了保证数据写入成功,在写入数据时系统会检查属性列数据的版本号。属性列数据的有效版本范围为[max{数据写入时间-有效版本偏差,数据写入时间-数据生命周期},数据写入时间+有效版本偏差)。只有当属性列数据的版本号(单位为毫秒)除以1000换算为秒后在有效版本范围时,才能成功写入数据。

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

创建数据表时,如果未设置有效版本偏差,则系统会使用默认值86400,您也可以自定义数据有效版本偏差。创建数据表后,您可以通过UpdateTable接口修改有效版本偏差。

使用方式

创建数据表时,您可以配置最大版本数、数据生命周期等参数。您也可以在创建数据表后修改数据版本、数据生命周期等。此处以创建数据表后修改相应配置为例介绍。

说明

关于在创建数据表时进行数据版本或者数据生命周期配置的具体操作,请参见数据表操作

使用控制台

您可以使用控制台修改表的最大版本数、数据生命周期、有效版本偏差等。

  1. 登录表格存储控制台

  2. 概览页面,单击实例操作列的实例管理

  3. 实例详情页签的数据表列表区域,单击数据表名称。

  4. 基本详情页签的基本信息区域,单击修改表属性

  5. 修改表属性对话框,根据下表说明修改相应配置信息。

    参数

    描述

    数据生命周期

    数据表中数据的保存时间。当数据的保存时间超过设置的数据生命周期时,系统会自动清理超过数据生命周期的数据。单位为秒。

    取值:大于等于86400秒(一天)或-1(数据永不过期)。

    重要

    使用索引时,数据生命周期必须满足如下条件中的任意一个。

    • 数据表的数据生命周期为-1(数据永不过期)。

    • 数据表的数据生命周期不为-1时,数据表为禁止更新状态。

      如果已为数据表创建索引,则需要修改是否允许更新后,再修改数据生命周期。

    最大版本数

    数据表中的属性列能够保留数据的最大版本个数。当属性列数据的版本个数超过设置的最大版本数时,系统会自动删除较早版本的数据。

    取值必须为非0整数。

    重要

    使用索引时,最大版本数必须设置为1。如果已为数据表创建索引,则无法修改最大版本数。

    数据有效版本偏差

    指定的数据版本号与系统当前时间偏差的允许最大值,单位为秒。有效版本偏差为正整数,可以大于1970-01-01 00:00:00 UTC时间到当前时间的秒数。

    只有当写入数据所有列的版本号与写入时时间的差值在数据有效版本偏差范围内,数据才能成功写入。

    属性列的有效版本范围为[max{数据写入时间-有效版本偏差,数据写入时间-数据生命周期},数据写入时间+有效版本偏差)

    是否允许更新

    是否允许通过UpdateRow更新写入数据。默认值为,表示允许通过UpdateRow更新写入数据。

    如果已为数据表创建索引,当要修改数据生命周期时,您需要先设置是否允许更新再进行修改。

    重要

    当要使用多元索引生命周期功能时,您必须设置此参数为,即不允许通过UpdateRow更新写入数据。关于多元索引生命周期的更多信息,请参见生命周期管理

  6. 单击确定

使用命令行工具CLI

您可以使用命令行工具执行如下命令进行配置修改。

执行alter命令修改表的最大版本数或者数据生命周期。更多信息,请参见更新表

以下示例用于修改mytable数据表的数据生命周期为86400秒(即1天),最大版本数为1。

alter -t mytable --ttl 86400 --version 1

使用SDK

您可以使用Java SDKGo SDKPython SDKNode.js SDK.NET SDKPHP SDK更新表的最大版本数、数据生命周期、有效版本偏差等属性。此处以Java SDK为例介绍更新表的使用。

以下示例用于更新数据表的最大版本数为5、数据生命周期为-1且有效版本偏差为86400。

private static void updateTable(SyncClient client) {
    //数据的过期时间,单位为秒,-1表示数据永不过期。
    int timeToLive = -1;
    //将最大版本数更新为5。
    int maxVersions = 5; 
    //将有效版本偏差更新为86400。单位为秒。
    int maxTimeDeviation=86400;
    TableOptions tableOptions = new TableOptions(timeToLive, maxVersions,maxTimeDeviation);
    //设置表名称。
    UpdateTableRequest request = new UpdateTableRequest("<TABLE_NAME>");
    request.setTableOptionsForUpdate(tableOptions);
    client.updateTable(request);
}

计费说明

  • 使用数据多版本时,会产生基于版本号与各个版本数据的额外存储费用。

  • 配置生命周期管理清理数据,不会有额外的数据清理费用。但开启生命周期管理功能后,会在各个属性列增加时间戳作为的版本号数据,有额外的存储量产生。

更多信息,请参见数据存储量

常见问题

修改数据表生命周期时报错[table ttl] must be bigger than or equal search index ttl