將列當成一個原子計數器使用,對該列進行原子計數操作,可用於為某些線上應用提供即時統計功能,例如統計文章的PV(即時瀏覽量)等。
前提條件
- 已初始化Client,詳情請參見初始化。
- 已建立資料表並寫入資料。
限制
- 只支援對整型列的列值進行原子計數操作。
- 作為原子計數器的列,如果寫入資料前該列不存在,則預設值為0;如果寫入資料前該列已存在且列值非整型,則產生OTSParameterInvalid錯誤。
- 增量值可以是正數或負數,但不能出現計算溢出。如果出現計算溢出,則產生OTSParameterInvalid錯誤。
- 預設不返回進行原子計數操作的列值,可以通過相應操作指定返回進行原子計數操作的列值。
- 在單次更新要求中,不能對某一列同時進行更新和原子計數操作。假設列A已經執行原子計數操作,則列A不能再執行其他動作(例如列的覆蓋寫,列刪除等)。
- 在一次BatchWriteRow請求中,支援對同一行進行多次更新操作。但是如果某一行已進行原子計數操作,則該行在此批量請求中只能出現一次。
- 原子計數操作只能作用在列值的最新版本,不支援對列值的特定版本做原子計數操作。更新完成後,原子計數操作會插入一個新的資料版本。
介面
updateRowChange類中新增了原子計數器的操作介面,操作介面說明請參見下表。
介面 | 說明 |
---|---|
IncrementColumn(columnName string, value int64) | 對列執行增量變更,例如+X,-X等。 |
AppendIncrementColumnToReturn(name string) | 對於進行原子計數操作的列,設定需要返回列值的列名。 |
SetReturnIncrementValue() | 設定傳回型別,返回進行原子計數操作的列的新值。 |
參數
參數 | 說明 |
---|---|
TableName | 資料表名稱。 |
ColumnName | 進行原子計數操作的列名。只支援對整型列的列值進行原子計數器操作。 |
Value | 對列進行增量變更的值。 |
樣本
寫入資料時,使用updateRowChange介面對整型列做列值的增量變更,然後讀取更新後的新值。
func UpdateRowWithIncrement(client *tablestore.TableStoreClient, tableName string) {
fmt.Println("begin to update row")
updateRowRequest = new(tablestore.UpdateRowRequest)
updateRowChange = new(tablestore.UpdateRowChange)
//設定資料表名稱。
updateRowChange.TableName = tableName
updatePk = new(tablestore.PrimaryKey)
updatePk.AddPrimaryKeyColumn("pk1", "pk1increment")
updatePk.AddPrimaryKeyColumn("pk2", int64(2))
updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
updateRowChange.PrimaryKey = updatePk
//將進行原子計數操作的col2列的列值+30,不能設定時間戳記。
updateRowChange.IncrementColumn("col2", int64(30))
//將進行原子計數操作的列值返回。
updateRowChange.SetReturnIncrementValue()
updateRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
updateRowChange.AppendIncrementColumnToReturn("col2")
updateRowRequest.UpdateRowChange = updateRowChange
resp, err := client.UpdateRow(updateRowRequest)
if err != nil {
fmt.Println("update failed with error:", err)
return
} else {
fmt.Println("update row finished")
fmt.Println(resp)
fmt.Println(len(resp.Columns))
fmt.Println(resp.Columns[0].ColumnName)
fmt.Println(resp.Columns[0].Value)
fmt.Println(resp.Columns[0].Timestamp)
}
}