云龙微网站开发seo技术专员招聘
news/
2025/9/28 0:41:06/
文章来源:
云龙微网站开发,seo技术专员招聘,租云服务器一个月多少钱,济南网站制作建设表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景#xff0c;帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍#xff0c;包括其参数、功能示例、使用场景等。 接口概述
UpdateRow接口是表格存储Tablestor…表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍包括其参数、功能示例、使用场景等。 接口概述
UpdateRow接口是表格存储Tablestore提供的基础读写接口之一用于对某一行进行更新操作若指定行不存在UpdateRow也可以用于新增一行。这里的更新包括新增、修改或删除某一列如果使用了多版本功能也可以对某列中指定的版本进行新增、修改或删除。此外在接口参数中也可以指定条件仅当满足条件时进行更新。下面详细介绍该接口的参数和功能。 接口参数说明 API定义和参数说明
首先是UpdateRow接口的API定义
message UpdateRowRequest {required string table_name 1;required bytes row_change 2;required Condition condition 3;optional ReturnContent return_content 4;
}message UpdateRowResponse {required ConsumedCapacity consumed 1;optional bytes row 2;
}
API定义中的具体参数说明见官网API文档https://help.aliyun.com/document_detail/27307.html SDK接口和参数说明
在项目代码中对表格存储Tablestore进行读写操作是通过表格存储Tablestore发布的各语言SDK进行的SDK对API进行了封装内部自动处理了请求的编码和响应的解析等。因此对于表格存储Tablestore的使用者来说只需要熟悉SDK的接口即可。
下面以Java SDK为例介绍SDK中的UpdateRow接口和参数。 接口定义
同步接口(SyncClient): /*** 更新表中的一行数据。* p若要更新的行不存在则新写入一行数据。/p* p更新操作可以包括新写入一个属性列或者删除一个属性列的一个或多个版本。/p** param updateRowRequest 执行UpdateRow操作所需的参数。* return TableStore服务返回的结果* throws TableStoreException TableStore服务返回的异常* throws ClientException 请求的返回结果无效、或遇到网络异常*/public UpdateRowResponse updateRow(UpdateRowRequest updateRowRequest)throws TableStoreException, ClientException;
异步接口(AsyncClient): /*** 更新表中的一行数据。* p若要更新的行不存在则新写入一行数据。/p* p更新操作可以包括新写入一个属性列或者删除一个属性列的一个或多个版本。/p** param updateRowRequest 执行UpdateRow操作所需的参数。* param callback 请求完成后调用的回调函数可以为null则代表不需要执行回调函数* return 获取结果的Future* throws TableStoreException TableStore服务返回的异常* throws ClientException 请求的返回结果无效、或遇到网络异常*/public FutureUpdateRowResponse updateRow(UpdateRowRequest updateRowRequest, TableStoreCallbackUpdateRowRequest, UpdateRowResponse callback);
具体参数说明
变量类型说明备注UpdateRowRequestUpdateRow接口的请求类型具体内容见后续说明。 UpdateRowResponseUpdateRow接口的返回结果具体内容见后续说明。 TableStoreCallback callbackUpdateRow接口的异步回调函数。仅适用于异步接口。Future异步接口的UpdateRow接口返回结果。仅适用于异步接口。 异步接口调用后不等待请求结束立即返回future通过future.get()可以获取实际接口响应的结果。UpdateRowRequest参数说明 具体参数说明
变量类型说明备注TxnRequest(基类)抽象类包含TransactionId成员变量继承该类的请求类型可用于局部事务中。TransactionId的使用可参考局部事务的文档。UpdateRowRequestUpdateRow接口的请求类型包含一个成员变量RowUpdateChange。 继承自TxnRequest表示该请求可用于局部事务中。 RowUpdateChange本次更新的具体请求参数。 RowUpdateChange参数说明 具体参数说明
变量类型类说明成员变量或接口说明RowChange(基类)RowUpdateChange的基类提供了设置表名、主键、更新条件、返回类型等通用参数。tableName指定本次更新要操作的表名。 primaryKey指定本次要更新的行的主键。 condition指定本次更新操作的条件可选。 returnType枚举类型默认为RT_NONE表示不返回行的内容此外还有两种值 (1)RT_PK: 返回主键适用于使用主键自增列功能的场景用于返回系统生成的自增主键值。 (2)RT_AFTER_MODIFY: 返回修改的列的数据适用于使用了原子加功能的场景用于返回原子加之后某一列的值。此时需要设置returnColumnNames。 returnColumnNames当returnType为RT_AFTER_MODIFY时指定要返回的被修改的列的列名(适用于原子加的场景)。RowUpdateChangeUpdateRow的具体请求参数继承自RowChange类。put(String columnName, ColumnValue value)新增或修改某一列的值。 (系统内部会为该列生成一个新的版本号单版本模式下无须关心该版本号) put(String columnName, ColumnValue value, long version)新增或修改某一列的某一个版本。 (适用于多版本模式手动指定版本号写入) put(Column column)功能同上述put接口只是参数使用Column类型进行了封装。 put(List column)功能同上述put接口只是参数为多列。 deleteColumns(String columnName)删除某列多版本模式下会删除该列全部版本。 deleteColumn(String columnName, long version)删除某列的指定版本适用于多版本模式下对特定版本进行删除。 increment(Column column)对某列进行原子加操作仅适用于整型类型。Condition本次更新的条件。可以指定行存在性条件和列条件列条件比如“某列的值大于5”。rowExistenceExpectation行存在性条件枚举类型有以下三种值 (1) IGNORE不对行存在性进行判断默认即为IGNORE。 (2) EXPECT_EXIST: 期望该行存在若不存在请求会报错。 (3) EXPECT_NOT_EXIST期望该行不存在若存在请求会报错。 注意 通常情况下若没有特殊的设置条件的需求使用IGNORE即可(保持默认可不做设置)此时写入性能也更好。 columnCondition列条件可以设置单列条件(SingleColumnValueCondition)也可以设置多列组合条件(CompositeColumnValueCondition)具体见条件更新的文档。UpdateRowResponse参数说明 具体参数说明
变量类型成员变量或接口说明Response(基类)requestId本次请求服务端返回的requestId用于问题调查建议在出错时打印到业务日志中。 traceId本次请求SDK生成的traceId用于问题调查建议在出错时打印到业务日志中。UpdateRowResponseconsumedCapacity本次请求消耗的读写CU用于计费。 row默认情况下为null仅当请求中returnType设置为返回PK(RT_PK)或者某列修改后的值(RT_AFTER_MODIFY)时返回对应的内容。功能示例
所有示例代码可以在Tablestore-Examples项目中查看。
Github地址https://github.com/aliyun/tablestore-examples/tree/master/basic/Java/DataManage/src/main/java/com/aliyun/tablestore/basic/dataManage 基本更新操作
UpdateRow接口最常用的场景是对某一行写入一些列或者删除一些列。通常业务使用单版本表比较多此时可以忽略列上多版本的概念按照每列只有一个值来理解。此时UpdateRow就是用于新增、修改或删除某些列。
新增若写入的属性列之前不存在UpdateRow执行后会新增该列。 修改若写入的属性列之前已经有值UpdateRow执行后会修改该列的值。 删除UpdateRow可以用于删除某些列若该列之前就不存在则无影响不会报错。 示例代码
下面的代码执行一次UpdateRow操作对某一行新增两列删除一列。 public void updateRowNormally() {PrimaryKey primaryKey PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString(string)).build();/*** 构造RowUpdateChange设置表名和主键*/RowUpdateChange rowChange new RowUpdateChange(TABLE_NAME, primaryKey);/*** 写入两列*/rowChange.put(col_str, ColumnValue.fromString(value1));rowChange.put(col_long, ColumnValue.fromLong(1));/*** 删除某列*/rowChange.deleteColumns(col_to_delete);/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在系统会新增该行。*/UpdateRowResponse updateRowResponse syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf(UpdateRowSuccess, request id: %s\n, updateRowResponse.getRequestId());}
使用UpdateRow新增、修改或者删除某些列是最基础的单行数据更新操作也是很常用的场景。
但在某些场景中若使用了表格存储Tablestore的多版本功能可能会有新增或修改某一列的某个特定版本的需求或者是需要删除某一列的某一个版本此时就需要指定时间戳来更新或删除见下面的示例。 指定版本操作
对于设置了保留多版本的表每一列上都会保留最新的N个版本UpdateRow可以对其中某个特定版本进行更新也可以删除某个特定版本。 示例代码
下面的代码执行一次UpdateRow操作对某一行写入两列指定版本号写入同时删除某列的某个版本也需要指定要删除的版本号。
注意在指定版本号时需要保证该版本号在表上设置的最大版本偏差内若超出该偏差范围可以调整表上的最大版本偏差设置。 public void updateRowMultiVersion() {PrimaryKey primaryKey PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString(string)).build();/*** 构造RowUpdateChange设置表名和主键*/RowUpdateChange rowChange new RowUpdateChange(TABLE_NAME, primaryKey);long version System.currentTimeMillis();/*** 写入两列指定版本号。* 若指定的版本之前不存在则会新增一个版本若该版本已存在会修改该版本的值。*/rowChange.put(col_str, ColumnValue.fromString(value1), version);rowChange.put(col_long, ColumnValue.fromLong(1), version);/*** 删除某列的某一个版本指定版本号。*/rowChange.deleteColumn(col_to_delete, version);/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在系统会新增该行。*/UpdateRowResponse updateRowResponse syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf(UpdateRowSuccess, request id: %s\n, updateRowResponse.getRequestId());} 条件更新
UpdateRow接口可以设置更新条件仅当满足条件时才进行更新条件包括行存在性条件和列条件。
行存在性条件在更新前检查该行存在或不存在仅当符合期望时才进行更新操作否则抛错。
列条件目前支持 SingleColumnValueCondition 和 CompositeColumnValueCondition是基于某一列或者某些列的列值进行条件判断比如“col_long的值应该大于5”等。基于列条件可以使用表格存储Tablestore实现分布式的乐观锁机制。
条件更新的功能文档https://help.aliyun.com/document_detail/35194.html 示例代码
设置行存在性条件和列条件 public void updateRowWithCondition() {PrimaryKey primaryKey PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString(string)).build();/*** 构造RowUpdateChange设置表名和主键*/RowUpdateChange rowChange new RowUpdateChange(TABLE_NAME, primaryKey);/*** 设置行存在条件为期望行存在*/Condition condition new Condition(RowExistenceExpectation.EXPECT_EXIST);/*** 设置列条件若只需要检查行存在性可以不设置列条件。** 这里设置列条件为两列的组合条件 (col_boolean true) (col_long 0)*/CompositeColumnValueCondition colCondition new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);SingleColumnValueCondition subColCondition1 new SingleColumnValueCondition(col_boolean,SingleColumnValueCondition.CompareOperator.EQUAL,ColumnValue.fromBoolean(true));subColCondition1.setPassIfMissing(true); // setPassIfMissing(true)表示若该列不存在也视为满足条件。SingleColumnValueCondition subColCondition2 new SingleColumnValueCondition(col_long,SingleColumnValueCondition.CompareOperator.GREATER_THAN,ColumnValue.fromLong(0L));colCondition.addCondition(subColCondition1).addCondition(subColCondition2);subColCondition2.setPassIfMissing(false); // setPassIfMissing(false)表示若该列不存在视为不满足条件。condition.setColumnCondition(colCondition);rowChange.setCondition(condition);/*** 满足条件时写入两列*/rowChange.put(col_str, ColumnValue.fromString(value1));rowChange.put(col_long, ColumnValue.fromLong(1));/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest new UpdateRowRequest(rowChange);/*** 调用updateRow接口。* 若不满足设置的条件比如该行不存在或者不满足列条件会抛OTSExceptionErrorCode为OTSConditionCheckFail.*/UpdateRowResponse updateRowResponse syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf(UpdateRowSuccess, request id: %s\n, updateRowResponse.getRequestId());} 原子计数器
UpdateRow支持对某一整型列进行原子加操作原子加操作可以原子的对某一整型列的数据进行增量变更操作比如在原来的基础上加10或者减5等等。原子加操作可以用来构造原子计数器。
原子计数器的功能文档https://help.aliyun.com/document_detail/90949.html 示例代码 public void updateRowIncrement() {PrimaryKey primaryKey PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString(string)).build();/*** 构造RowUpdateChange设置表名和主键*/RowUpdateChange rowChange new RowUpdateChange(TABLE_NAME, primaryKey);String columnName col_long;/*** 对col_long这一列进行原子加100操作。* 若该列之前不存在会从0开始累加。*/rowChange.increment(new Column(columnName, ColumnValue.fromLong(100)));/*** 设置返回修改后的该列值。*/rowChange.setReturnType(ReturnType.RT_AFTER_MODIFY);rowChange.addReturnColumn(columnName);/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在系统会新增该行。*/UpdateRowResponse updateRowResponse syncClient.updateRow(updateRowRequest);/*** 打印修改后的该列的值和RequestId*/System.out.printf(UpdateRowSuccess, column [%s] was updated to %d, request id: %s\n,columnName,updateRowResponse.getRow().getLatestColumn(columnName).getValue().asLong(),updateRowResponse.getRequestId());}
原文链接 本文为阿里云原创内容未经允许不得转载。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920130.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!