數據生命周期(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。
在數據表的基本詳情頁簽中基本信息區域,單擊修改表屬性。
在修改表屬性對話框,根據需要設置數據生命周期,然后單擊確定。
使用SDK
您可以通過Java SDK或者Go SDK使用生命周期管理。此處以Java SDK為例介紹數據生命周期的管理。
禁用數據表UpdateRow更新寫入操作。
以下示例用于禁用數據表的UpdateRow更新寫入操作。
public static void disableTableUpdate(SyncClient client) { UpdateTableRequest updateTableRequest = new UpdateTableRequest("<TABLE_NAME>"); TableOptions options = new TableOptions(); // 禁用數據表UpdateRow更新寫入操作,請確保數據表無UpdateRow寫入操作,避免影響業務。 options.setAllowUpdate(false); updateTableRequest.setTableOptionsForUpdate(options); client.updateTable(updateTableRequest); }
設置多元索引生命周期。
禁用數據表UpdateRow更新寫入操作后,您可以在創建多元索引時指定TTL或者為已有多元索引指定TTL。
創建多元索引時指定TTL
以下示例用于創建一個多元索引,多元索引包含Col_Keyword和Col_Long兩列,類型分別設置為字符串(String)和整型(Long)。同時指定多元索引生命周期為7天。
// 請使用5.12.0及以上版本的Java SDK。 public static void createIndexWithTTL(SyncClient client) { int days = 7; CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest(); //設置數據表名稱。 createRequest.setTableName("<TABLE_NAME>"); //設置多元索引名稱。 createRequest.setIndexName("<SEARCH_INDEX_NAME>"); IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( //設置字段名和類型。 new FieldSchema("Col_Keyword", FieldType.KEYWORD), new FieldSchema("Col_Long", FieldType.LONG))); createRequest.setIndexSchema(indexSchema); //設置多元索引TTL。 createRequest.setTimeToLiveInDays(days); //調用client創建多元索引。 client.createSearchIndex(createRequest); }
為已有多元索引指定TTL
以下示例用于指定已有多元索引的生命周期為7天。
// 請使用5.12.0及以上版本的Java SDK。 public static void updateIndexWithTTL(SyncClient client) { int days = 7; UpdateSearchIndexRequest updateSearchIndexRequest = new UpdateSearchIndexRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>"); // 更新多元索引TTL。 updateSearchIndexRequest.setTimeToLiveInDays(days); client.updateSearchIndex(updateSearchIndexRequest); }
多元索引的TTL和數據表的TTL是獨立的。如果需要使用數據表TTL,請為數據表設置TTL。
以下示例用于指定數據表的生命周期為7天。
public static void updateTableTTL(SyncClient client) { int days = 7; UpdateTableRequest updateTableRequest = new UpdateTableRequest("<TABLE_NAME>"); TableOptions options = new TableOptions(); options.setTimeToLiveInDays(days); updateTableRequest.setTableOptionsForUpdate(options); client.updateTable(updateTableRequest); }