数据生命周期(Time To Live,简称TTL)是多元索引的一个属性,即数据的保存时间。多元索引会自动清理超过保存时间的数据,减少用户的数据存储空间,降低存储成本。
注意事项
- 使用生命周期管理功能,必须禁用数据表的UpdateRow更新写入功能,避免一些语义上的问题:
由于数据表TTL是属性列级别生效的,而多元索引TTL是整行生效的,如果存在UpdateRow写入操作,当系统清理数据表中数据时,数据表中部分字段值已删除而部分字段值未删除,但是多元索引中整行数据均未删除,则会造成数据表和多元索引中的数据不一致。
如果业务有UpdateRow更新写入操作,请查看是否能改为PutRow覆盖写入操作。
- 多元索引的TTL取值范围为-1或者int32的正整数(单位为秒),其中-1表示永久存储,int32最大值换算为年大约为68年。
- 多元索引的TTL和数据表的TTL是独立的,多元索引的TTL值必须小于或等于数据表的TTL值。当需要同时调小多元索引TTL和数据表TTL时,请先调整多元索引TTL,再调整数据表TTL。
- 多元索引每天会自动清理已过期的数据,过期数据的清理粒度为“天”,因此您仍然可以查询到某一时刻已过期但是还未及时清理的数据,多元索引会在下一次清理过期数据时自动清理这些过期数据。
- 数据表和多元索引的TTL更新后,系统会在下一次清理过期数据时自动清理数据表和多元索引中的存量过期数据。
使用流程
通过控制台或者SDK设置多元索引生命周期。使用多元索引生命周期,您必须一直保持数据表UpdateRow更新写入操作为禁止状态。
使用控制台
- 禁用数据表UpdateRow更新写入操作。
- 在数据表的基本详情页签,单击修改表属性。
- 在修改表属性对话框,设置是否允许更新为否,然后单击确定。
- 设置多元索引生命周期。
禁用数据表UpdateRow更新写入操作后,您可以在创建多元索引时指定TTL或者为已有多元索引指定TTL。
- 创建多元索引时指定TTL
- 在数据表的索引管理页签,单击创建多元索引。
- 在创建索引对话框,设置索引名、数据生命周期和Schema生成方式,然后单击确定。
- 为已有多元索引指定TTL
- 在数据表的索引管理页签,单击目标多元索引操作列的索引详情。
- 在索引详情对话框,单击
图标,修改数据生命周期,然后单击修改ttl。
- 单击确定。
- 在数据表的索引管理页签,单击目标多元索引操作列的索引详情。
- 创建多元索引时指定TTL
- 多元索引的TTL和数据表的TTL是独立的。如果需要使用数据表TTL,请为数据表设置TTL。
- 在数据表的基本详情页签中基本信息区域,单击修改表属性。
- 在修改表属性对话框,根据需要设置数据生命周期,然后单击确定。
使用SDK
您可以通过如下语言的SDK使用生命周期管理。
具体操作流程如下:
- 禁用数据表UpdateRow更新写入操作。
public void disableTableUpdate(SyncClient client) { UpdateTableRequest updateTableRequest = new UpdateTableRequest(tableName); TableOptions options = new TableOptions(); // 禁用数据表UpdateRow更新写入操作,请确保数据表无UpdateRow写入操作,避免影响业务。 options.setAllowUpdate(false); updateTableRequest.setTableOptionsForUpdate(options); client.updateTable(updateTableRequest); }
- 设置多元索引生命周期。
禁用数据表UpdateRow更新写入操作后,您可以在创建多元索引时指定TTL或者为已有多元索引指定TTL。
- 创建多元索引时指定TTL
// 请使用5.12.0及以上版本的Java SDK。 public void createIndexWithTTL(SyncClient client) { int days = 7; CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest(); createRequest.setTableName(tableName); createRequest.setIndexName(indexName); createRequest.setIndexSchema(indexSchema); // 设置多元索引TTL。 createRequest.setTimeToLiveInDays(days); client.createSearchIndex(createRequest); }
- 为已有多元索引指定TTL
// 请使用5.12.0及以上版本的Java SDK。 public void updateIndexWithTTL(SyncClient client) { int days = 7; UpdateSearchIndexRequest updateSearchIndexRequest = new UpdateSearchIndexRequest(tableName, indexName); // 更新多元索引TTL。 updateSearchIndexRequest.setTimeToLiveInDays(days); client.updateSearchIndex(updateSearchIndexRequest); }
- 创建多元索引时指定TTL
- 多元索引的TTL和数据表的TTL是独立的。如果需要使用数据表TTL,请为数据表设置TTL。
public void updateTableTTL(SyncClient client) { int days = 7; UpdateTableRequest updateTableRequest = new UpdateTableRequest(tableName); TableOptions options = new TableOptions(); options.setTimeToLiveInDays(days); updateTableRequest.setTableOptionsForUpdate(options); client.updateTable(updateTableRequest); }