通過 Java SDK 配置多元索引的資料生命週期(Time To Live,TTL),Tablestore 會自動清理超過儲存期限的索引資料。
前提條件
開始前,完成以下準備工作:
-
安裝 5.12.0 及以上版本的Tablestore Java SDK並初始化用戶端。
-
已建立待配置的資料表,並將最大版本數設定為 1。
注意事項
-
使用多元索引生命週期管理功能前,必須禁止資料表通過
UpdateRow更新資料,以避免資料表與多元索引的資料不一致。資料表 TTL 按屬性列生效,多元索引 TTL 按整行生效。使用
UpdateRow更新資料時,系統清理到期資料後,資料表可能只保留部分屬性列,而多元索引仍保留整行資料。需要更新資料時,請改用
PutRow覆蓋整行資料。 -
多元索引 TTL 的單位為秒,取值為
-1或 int32 範圍內的正整數。-1表示永久儲存,正整數最大值對應的儲存時間約為 68 年。 -
多元索引 TTL 與資料表 TTL 獨立配置,但多元索引 TTL 必須小於或等於資料表 TTL。如果多元索引的目標 TTL 大於當前資料表 TTL,先增巨量資料表 TTL;如果同時減小二者,先減小多元索引 TTL。
-
Tablestore 每天自動清理多元索引中的到期資料。在下一次清理完成前,查詢仍可能返回已到期但尚未清理的資料。
-
更新資料表或多元索引的 TTL 後,Tablestore 會在下一次清理周期自動清理因 TTL 變更而到期的存量資料。
操作步驟
生命週期配置包括禁止資料表通過 UpdateRow 更新資料、設定多元索引生命週期,以及按需設定資料表生命週期。資料表生命週期不是固定的最後一步,操作順序必須保證多元索引 TTL 小於或等於資料表 TTL:如果多元索引的目標 TTL 大於當前資料表 TTL,先增巨量資料表 TTL;如果同時減小二者,先減小多元索引 TTL。
-
禁止資料表通過
UpdateRow更新資料。以下樣本禁止
example_table通過UpdateRow更新資料。String tableName = "example_table"; UpdateTableRequest request = new UpdateTableRequest(tableName); TableOptions tableOptions = new TableOptions(); tableOptions.setAllowUpdate(false); request.setTableOptionsForUpdate(tableOptions); client.updateTable(request); -
設定多元索引生命週期。
根據多元索引是否已建立,選擇相應的設定方式。
建立索引
建立多元索引時,將生命週期設定為 7 天。
String tableName = "example_table"; String indexName = "example_index"; IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( new FieldSchema("category", FieldType.KEYWORD), new FieldSchema("price", FieldType.LONG))); CreateSearchIndexRequest request = new CreateSearchIndexRequest(); request.setTableName(tableName); request.setIndexName(indexName); request.setIndexSchema(indexSchema); request.setTimeToLiveInDays(7); client.createSearchIndex(request);已有索引
將已有多元索引的生命週期更新為 7 天。
String tableName = "example_table"; String indexName = "example_index"; UpdateSearchIndexRequest request = new UpdateSearchIndexRequest(tableName, indexName); request.setTimeToLiveInDays(7); client.updateSearchIndex(request); -
按需設定資料表生命週期。
以下樣本將
example_table的生命週期設定為 7 天。請根據上述 TTL 約束,在設定多元索引生命週期之前或之後執行此操作。String tableName = "example_table"; UpdateTableRequest request = new UpdateTableRequest(tableName); TableOptions tableOptions = new TableOptions(); tableOptions.setTimeToLiveInDays(7); request.setTableOptionsForUpdate(tableOptions); client.updateTable(request);