将列当成一个原子计数器使用,对该列进行原子计数操作,可用于为某些在线应用提供实时统计功能,例如统计帖子的PV(实时浏览量)等。

前提条件

  • 已初始化Client,详情请参见初始化
  • 已创建数据表并写入数据。

限制

  • 只支持对整型列的列值进行原子计数操作。
  • 作为原子计数器的列,如果写入数据前该列不存在,则默认值为0;如果写入数据前该列已存在且列值非整型,则产生OTSParameterInvalid错误。
  • 增量值可以是正数或负数,但不能出现计算溢出。如果出现计算溢出,则产生OTSParameterInvalid错误。
  • 默认不返回进行原子计数操作的列值,可以通过相应操作指定返回进行原子计数操作的列值。
  • 在单次更新请求中,不能对某一列同时进行更新和原子计数操作。假设列A已经执行原子计数操作,则列A不能再执行其他操作(例如列的覆盖写,列删除等)。
  • 在一次BatchWriteRow请求中,支持对同一行进行多次更新操作。但是如果某一行已进行原子计数操作,则该行在此批量请求中只能出现一次。
  • 原子计数操作只能作用在列值的最新版本,不支持对列值的特定版本做原子计数操作。更新完成后,原子计数操作会插入一个新的数据版本。

接口

rowUpdateChange类中新增了原子计数器的操作接口,操作接口说明请参见下表。
接口 说明
RowUpdateChange Increment(Column column) 对列执行增量变更,例如+X,-X等。
List<String> ReturnColumnNames 对于进行原子计数操作的列,设置需要返回列值的列名。
ReturnType ReturnType 设置返回类型,返回进行原子计数操作的列的新值。

参数

参数 说明
TableName 数据表名称。
ColumnName 进行原子计数操作的列名。只支持对整型列的列值进行原子计数操作。
Value 对列进行增量变更的值。
ReturnColumnNames 对于进行原子计数操作的列,设置需要返回列值的列名。
ReturnType 设置返回类型为ReturnType.RT_AFTER_MODIFY,将进行原子计数操作的列值返回。

示例

写入数据时,使用rowUpdateChange接口对整型列做列值的增量变更,然后读取更新后的新值。
public static void Increment(int incrementValue)
{
    Console.WriteLine("Start set increment column...");
    OTSClient otsClient = Config.GetClient();

    //定义行的主键,必须与创建表时TableMeta中定义的一致。
    PrimaryKey primaryKey = new PrimaryKey
    {
        { Pk1, new ColumnValue(0) },
        { Pk2, new ColumnValue("abc") }
    };
    RowUpdateChange rowUpdateChange = new RowUpdateChange(TableName, primaryKey); //设置数据表名称。
    //设置ReturnType为ReturnType.RT_AFTER_MODIFY,将进行原子计数操作的列值返回。
    rowUpdateChange.ReturnType = ReturnType.RT_AFTER_MODIFY;
    rowUpdateChange.ReturnColumnNames = new List<string>() { IncrementCol};
    //设置进行原子计数操作的列,该列从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);
}