資料生命週期(Time To Live,簡稱TTL)是多元索引的一個屬性,即資料的儲存時間。多元索引會自動清理超過儲存時間的資料,減少使用者的資料存放區空間,降低儲存成本。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已建立資料表。具體操作,請參見建立資料表。
注意事項
使用生命週期管理功能,必須禁用資料表的UpdateRow更新寫入功能,避免一些語義上的問題:
由於資料表TTL是屬性列層級生效的,而多元索引TTL是整行生效的,如果存在UpdateRow寫入操作,當系統清理資料表中資料時,資料表中部分欄位值已刪除而部分欄位值未刪除,但是多元索引中整行資料均未刪除,則會造成資料表和多元索引中的資料不一致。
如果業務有UpdateRow更新寫入操作,請查看是否能改為PutRow覆蓋寫入操作。
多元索引的TTL取值範圍為-1或者int32的正整數(單位為秒),其中-1表示永久儲存,int32最大值換算為年大約為68年。
多元索引的TTL和資料表的TTL是獨立的,多元索引的TTL值必須小於或等於資料表的TTL值。當需要同時調小多元索引TTL和資料表TTL時,請先調整多元索引TTL,再調整資料表TTL。
多元索引每天會自動清理已到期的資料,到期資料的清理粒度為“天”,因此您仍然可以查詢到某一時刻已到期但是還未及時清理的資料,多元索引會在下一次清理到期資料時自動清理這些到期資料。
資料表和多元索引的TTL更新後,系統會在下一次清理到期資料時自動清理資料表和多元索引中的存量到期資料。
使用流程
禁用資料表UpdateRow更新寫入操作。
以下樣本用于禁用資料表的UpdateRow更新寫入操作。
func disableTableUpdate(client *tablestore.TableStoreClient) { request := &tablestore.UpdateTableRequest{ TableName: "TableName", TableOption: &tablestore.TableOption{ TimeToAlive: -1, // 資料表生命週期保持預設,預設值為-1。 MaxVersion: 1, // 最大版本數保持預設,預設值為1。 DeviationCellVersionInSec: 86400, // 有效版本偏差保持預設,預設值為86400。單位為秒。 // 禁用資料表UpdateRow更新寫入操作,請確保資料表無UpdateRow寫入操作,避免影響業務。注意多元索引存在TTL時不能修改為允許更新。 AllowUpdate: proto.Bool(false), }, } resp, err := client.UpdateTable(request) if err != nil { fmt.Println("error :", err) return } fmt.Println("UpdateTable finished, requestId:", resp.ResponseInfo.RequestId) }
設定多元索引生命週期。
禁用資料表UpdateRow更新寫入操作後,您可以在建立多元索引時指定TTL或者為已有多元索引指定TTL。
建立多元索引時指定TTL
以下樣本用於建立一個多元索引,多元索引包含col1和col2兩列,類型分別設定為字串(String)和整型(Long)。同時指定多元索引生命週期為7天。
func createIndexWithTTL(client *tablestore.TableStoreClient) { request := &tablestore.CreateSearchIndexRequest{} request.TableName = "<TABLE_NAME>" request.IndexName = "<SEARCH_INDEX_NAME>" schemas := []*tablestore.FieldSchema{} field1 := &tablestore.FieldSchema{ FieldName: proto.String("col1"), //設定欄位名,使用proto.String用於擷取字串指標。 FieldType: tablestore.FieldType_KEYWORD, //設定欄位類型。 Index: proto.Bool(true), //設定開啟索引。 EnableSortAndAgg: proto.Bool(true), //設定開啟排序與統計彙總功能。 } field2 := &tablestore.FieldSchema{ FieldName: proto.String("col2"), FieldType: tablestore.FieldType_LONG, Index: proto.Bool(true), EnableSortAndAgg: proto.Bool(true), } schemas = append(schemas, field1, field2) request.IndexSchema = &tablestore.IndexSchema{ FieldSchemas: schemas, //設定多元索引包含的欄位。 } request.TimeToLive = proto.Int32(3600 * 24 * 7) // 設定多元索引TTL為7天到期。 resp, err := client.CreateSearchIndex(request) if err != nil { fmt.Println("error :", err) return } fmt.Println("createIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId) }
為已有多元索引指定TTL
以下樣本用於指定已有多元索引的生命週期為7天。
func updateIndexWithTTL(client *tablestore.TableStoreClient) { request := &tablestore.UpdateSearchIndexRequest{} request.TableName = "TableName" request.IndexName = "IndexName" request.TimeToLive = proto.Int32(3600 * 24 * 7) // 設定多元索引TTL為7天到期。 resp, err := client.UpdateSearchIndex(request) if err != nil { fmt.Println("error :", err) return } fmt.Println("updateIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId) }
多元索引的TTL和資料表的TTL是獨立的。如果需要使用資料表TTL,請為資料表設定TTL。
以下樣本用於指定資料表的生命週期為7天。
// 設定資料表的TTL為7天到期。 func updateTableTTL(client *tablestore.TableStoreClient) { request := &tablestore.UpdateTableRequest{ TableName: "TableName", TableOption: &tablestore.TableOption{ TimeToAlive: 3600 * 24 * 7, // 設定資料表的TTL為7天到期,請確保資料表的TTL大於等於多元索引TTL。 MaxVersion: 1, // 最大版本數保持預設,預設值為1。 DeviationCellVersionInSec: 86400, // 有效版本偏差保持預設, 預設值為86400。單位為秒。 // 禁用資料表Update更新寫入操作,請確保資料表無Update寫入操作,避免影響業務。注意多元索引存在TTL時不能修改為允許更新。 AllowUpdate: proto.Bool(false), }, } resp, err := client.UpdateTable(request) if err != nil { fmt.Println("error :", err) return } fmt.Println("UpdateTable finished, requestId:", resp.ResponseInfo.RequestId) }
常見問題
修改資料表生命週期時報錯[table ttl] must be bigger than or equal search index ttl
相關文檔
如果要擷取某個資料表關聯的所有多元索引的列表資訊,您可以使用列出多元索引列表功能實現。具體操作,請參見列出多元索引列表。
如果要查詢多元索引的描述資訊,包括多元索引的欄位資訊和索引配置等,您可以使用查詢多元索引描述資訊功能實現。具體操作,請參見查詢多元索引描述資訊。
如果要在多元索引中新增、更新或者刪除索引列,您可以使用動態修改schema功能實現。具體操作,請參見動態修改schema。
如果不再需要使用多元索引,您可以刪除多元索引。具體操作,請參見刪除多元索引。