原子計數(shù)器
如果要在某些在線應用中快速進行計數(shù)操作,您可以使用原子計數(shù)器實現(xiàn)。使用原子計數(shù)器時,您需要將表中的某一列當成一個原子計數(shù)器,然后對該列進行原子計數(shù)操作。
前提條件
已初始化Client,具體操作,請參見初始化OTSClient。
已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。具體操作,請參見創(chuàng)建數(shù)據(jù)表和寫入數(shù)據(jù)。
注意事項
只支持對整型列的列值進行原子計數(shù)操作。
作為原子計數(shù)器的列,如果寫入數(shù)據(jù)前該列不存在,則默認值為0;如果寫入數(shù)據(jù)前該列已存在且列值非整型,則產(chǎn)生OTSParameterInvalid錯誤。
增量值可以是正數(shù)或負數(shù),但不能出現(xiàn)計算溢出。如果出現(xiàn)計算溢出,則產(chǎn)生OTSParameterInvalid錯誤。
默認不返回進行原子計數(shù)操作的列值,您可以通過相應操作指定返回進行原子計數(shù)操作的列值。
在單次更新請求中,不能對某一列同時進行更新和原子計數(shù)操作。假設列A已經(jīng)執(zhí)行原子計數(shù)操作,則列A不能再執(zhí)行其他操作(例如列的覆蓋寫,列刪除等)。
在一次BatchWriteRow請求中,支持對同一行數(shù)據(jù)進行多次更新操作。但是如果某一行已進行原子計數(shù)操作,則該行在此批量請求中只能出現(xiàn)一次。
原子計數(shù)操作只能作用在列值的最新版本,不支持對列值的特定版本做原子計數(shù)操作。更新完成后,原子計數(shù)操作會插入一個新的數(shù)據(jù)版本。
接口
rowUpdateChange類中新增了原子計數(shù)器的操作接口,操作接口說明請參見下表。
接口 | 說明 |
RowUpdateChange Increment(Column column) | 對列執(zhí)行增量變更,例如+X,-X等。 |
List<String> ReturnColumnNames | 對于進行原子計數(shù)操作的列,設置需要返回列值的列名。 |
ReturnType ReturnType | 設置返回類型,返回進行原子計數(shù)操作的列的新值。 |
參數(shù)
參數(shù) | 說明 |
TableName | 數(shù)據(jù)表名稱。 |
ColumnName | 進行原子計數(shù)操作的列名。只支持對整型列的列值進行原子計數(shù)操作。 |
Value | 對列進行增量變更的值。 |
ReturnColumnNames | 對于進行原子計數(shù)操作的列,設置需要返回列值的列名。 |
ReturnType | 設置返回類型為ReturnType.RT_AFTER_MODIFY,將進行原子計數(shù)操作的列值返回。 |
示例
以下示例用于在寫入數(shù)據(jù)時,使用rowUpdateChange接口對整型列做列值的增量變更,然后讀取更新后的新值。
public static void Increment(int incrementValue)
{
Console.WriteLine("Start set increment column...");
OTSClient otsClient = Config.GetClient();
//定義行的主鍵,必須與創(chuàng)建表時TableMeta中定義的一致。
PrimaryKey primaryKey = new PrimaryKey
{
{ Pk1, new ColumnValue(0) },
{ Pk2, new ColumnValue("abc") }
};
RowUpdateChange rowUpdateChange = new RowUpdateChange(TableName, primaryKey); //設置數(shù)據(jù)表名稱。
//設置ReturnType為ReturnType.RT_AFTER_MODIFY,將進行原子計數(shù)操作的列值返回。
rowUpdateChange.ReturnType = ReturnType.RT_AFTER_MODIFY;
rowUpdateChange.ReturnColumnNames = new List<string>() { IncrementCol};
//設置進行原子計數(shù)操作的列,該列從0開始自增,每次增加incrementValue。
rowUpdateChange.Increment(new Column(IncrementCol, new ColumnValue(incrementValue)));
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
var response = otsClient.UpdateRow(updateRowRequest);
Console.WriteLine("set Increment column succeed Increment result:" + response.Row.GetColumns()[0].Value);
}