將列當成一個原子計數器使用,對該列進行原子計數操作,可用於為某些線上應用提供即時統計功能,例如統計文章的PV(即時瀏覽量)等。

前提條件

  • 已初始化OTSClient,詳情請參見初始化
  • 已建立資料表並寫入資料。

限制

  • 只支援對整型列的列值進行原子計數操作。
  • 作為原子計數器的列,如果寫入資料前該列不存在,則預設值為0;如果寫入資料前該列已存在且列值非整型,則產生OTSParameterInvalid錯誤。
  • 增量值可以是正數或負數,但不能出現計算溢出。如果出現計算溢出,則產生OTSParameterInvalid錯誤。
  • 預設不返回進行原子計數操作的列值,可以通過相應操作指定返回進行原子計數操作的列值。
  • 在單次更新要求中,不能對某一列同時進行更新和原子計數操作。假設列A已經執行原子計數操作,則列A不能再執行其他動作(例如列的覆蓋寫,列刪除等)。
  • 在一次BatchWriteRow請求中,支援對同一行進行多次更新操作。但是如果某一行已進行原子計數操作,則該行在此批量請求中只能出現一次。
  • 原子計數操作只能作用在列值的最新版本,不支援對列值的特定版本做原子計數操作。更新完成後,原子計數操作會插入一個新的資料版本。

介面

rowUpdateChange類中新增了原子計數器的操作介面,操作介面說明請參見下表。

介面 說明
RowUpdateChange increment(Column column) 對列執行增量變更,例如+X,-X等。
void addReturnColumn(String columnName) 對於進行原子計數操作的列,設定需要返回列值的列名。
void setReturnType(ReturnType returnType) 設定傳回型別,返回進行原子計數操作的列的新值。

參數

參數 說明
tableName 資料表名稱。
columnName 進行原子計數操作的列名。只支援對整型列的列值進行原子計數器操作。
value 對列進行增量變更的值。
returnType 設定傳回型別為ReturnType.RT_AFTER_MODIFY,將進行原子計數操作的列值返回。

樣本

寫入資料時,使用rowUpdateChange介面對整型列做列值的增量變更,然後讀取更新後的新值。
private static void incrementByUpdateRowApi(SyncClient client) {
        //構造主鍵。
        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk0"));
        PrimaryKey primaryKey = primaryKeyBuilder.build();
        //設定資料表名稱。
        RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey); 

        //將進行原子計數操作的price列的列值+10,不能設定時間戳記。
        rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));

        //設定returnType為ReturnType.RT_AFTER_MODIFY,將進行原子計數操作的列值返回。
        rowUpdateChange.addReturnColumn("price");
        rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);

        //對price列進行原子計數操作。
        UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));

        //列印更新後的新值。
        Row row = response.getRow();
        System.out.println(row);
    }