全部产品
Search
文档中心

表格存储:原子计数器

更新时间:Dec 04, 2023

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

前提条件

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

限制

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

接口

/**
 * 更新一行数据。
 * @api
 * @param [] $request 请求参数。
 * @return [] 请求返回。
 * @throws OTSClientException 当参数检查出错或服务端返回校验出错时抛出异常。
 * @throws OTSServerException 当OTS服务端返回错误时抛出异常。
 */
public function updateRow(array $request);         

updateRow接口中新增了原子计数器的操作接口,操作说明请参见下表。

操作

说明

update_of_attribute_columns

更新类型为INCREMENT,对列执行增量变更,例如+X,-X等。配置格式如下:

'update_of_attribute_columns'=> array(
    'INCREMENT' => array (     
        array('<column_name>', <value>, ColumnTypeConst::CONST_INTEGER), 
    ),
)

return_content

返回进行增量变更后的列值。您需要设置进行增量变更的列名以及设置返回类型为ReturnTypeConst::CONST_AFTER_MODIFY。配置格式如下:

'return_content' => array(
    'return_type' => ReturnTypeConst::CONST_AFTER_MODIFY,
    'return_column_names' => array('<column_name>')
 )

参数

参数

说明

table_name

数据表名称。

column_name

进行原子计数操作的列名。只支持对整型列的列值进行原子计数器操作。

value

对列进行增量变更的值。

return_content

返回进行原子计数操作的列信息。包含return_type和return_column_names配置。

  • return_type:设置此参数为ReturnTypeConst::CONST_AFTER_MODIFY,返回进行原子计数操作的列的新值。

  • return_column_names:对于进行原子计数操作的列,返回列值的列名。

示例

以下示例用于在写入数据时对整型列做列值的增量变更,然后读取更新后的新值。

$request = array (
    //设置数据表名称。
    'table_name' => 'MyTable',
    //设置行存在性条件为RowExistenceExpectationConst::CONST_IGNORE,表示忽略行是否存在,不做任何行存在性检查。
    'condition' => RowExistenceExpectationConst::CONST_IGNORE,
    //设置主键值。设置的主键个数和类型必须与数据表的主键个数和类型一致。
    'primary_key' => array ( 
        //第一列主键名为PK0,类型为整型,列值为123。
        array('PK0', 123),
        //第二列主键名为PK1,类型为字符串,列值为'inc'。
        array('PK1', 'inc')
    ),
    //更新的属性列。支持设置PUT、DELETE和DELETE_ALL三种操作类型。
    'update_of_attribute_columns'=> array(
        'INCREMENT' => array (     
            //设置进行原子操作的列名为attr0以及设置对列进行增量变更的值为1.其中attr0列的数据类型为整型。
            array('attr0', 1, ColumnTypeConst::CONST_INTEGER), 
        ),
        'PUT' => array(
            array('attr1', 1, ColumnTypeConst::CONST_INTEGER),
        )
    ),
    //返回进行原子操作后的列信息。
    'return_content' => array(
        'return_type' => ReturnTypeConst::CONST_AFTER_MODIFY,
        'return_column_names' => array('attr0')
    )
);
$response = $otsClient->updateRow ($request);
print json_encode ($response);