如何通过 Ruby 使用 Azure 表存储

Tip

本文内容适用于原始的基本 Azure 表存储。 但是,公共预览版中现提供 Azure 表存储的高级版本,该版本提供优化了吞吐量的表、全局分发和自动化辅助索引。 若要详细了解和体验高级版,请查看 Azure Cosmos DB:表 API。 本文中的编程语言在高级版中尚不受支持,但在将来会添加该支持。

概述

本指南演示如何使用 Azure 表服务执行常见任务。 相关示例是使用 Ruby API 编写的。 涉及的情景包括创建和删除表、在表中插入和查询条目。

什么是表服务?

Azure 表存储服务可存储大量结构化数据。 该服务是一个 NoSQL 数据存储,接受来自 Azure 云内部和外部的通过验证的呼叫。 Azure 表最适合存储结构化非关系型数据。 表服务的常见用途包括:

  • 存储 TB 量级的结构化数据,能够为 Web 规模应用程序提供服务
  • 存储无需复杂联接、外键或存储过程,并且可以对其进行非规范化以实现快速访问的数据集
  • 使用聚集索引快速查询数据
  • 使用 OData 协议和 LINQ 查询以及 WCF 数据服务 .NET 库访问数据

可以使用表服务来存储和查询大型结构化非关系型数据集,并且表会随着需求的增加而扩展。

表服务概念

表服务包含以下组件:

表服务组件示意图

  • URL 格式: 代码使用此地址格式对帐户中的表进行寻址:
    http://<storage account>.table.core.chinacloudapi.cn/<table>

    可以直接使用此地址和 OData 协议来访问 Azure 表。 有关详细信息,请参阅 OData.org

  • 存储帐户: 对 Azure 存储服务的所有访问都要通过存储帐户来完成。 有关存储帐户容量的详细信息,请参阅 Azure 存储可伸缩性和性能目标
  • :表是实体的集合。 表不对实体强制实施架构,这意味着单个表可以包含具有不同属性集的实体。 一个存储帐户可以包含的表数仅受存储帐户容量限制。
  • 实体:与数据库行类似,一个实体就是一组属性。 一个实体的大小可达 1 MB。
  • 属性:属性是名称/值对。 每个实体最多可包含 252 个用于存储数据的属性。 每个实体还包含 3 个系统属性,分别指定分区键、行键和时间戳。 对具有相同分区键的实体的查询速度将更快,并且可以在原子操作中插入/更新这些实体。 一个实体的行键是它在一个分区内的唯一标识符。

有关命名表和属性的详细信息,请参阅 了解表服务数据模型

创建 Azure 存储帐户

创建第一个 Azure 存储帐户的最简单方法是使用 Azure 门户。 若要了解更多信息,请参阅 创建存储帐户

还可使用 Azure PowerShellAzure CLI适用于 .NET 的存储资源提供程序客户端库创建 Azure 存储帐户。

如果暂时不想创建存储帐户,也可以使用 Azure 存储模拟器在本地环境中运行和测试代码。 有关详细信息,请参阅 使用 Azure 存储模拟器进行开发和测试

创建 Ruby 应用程序

有关如何创建 Ruby 应用程序的说明,请参阅 Azure VM 上的 Ruby on Rails Web 应用程序

配置应用程序以访问存储

要使用 Azure 存储,需下载和使用 Ruby Azure 包,其中包括与存储 REST 服务通信的一组方便的库。

使用 RubyGems 获取该程序包

  1. 使用命令行接口,例如 PowerShell (Windows)、Terminal (Mac) 或 Bash (Unix)。
  2. 在命令窗口中键入 gem install azure 以安装 gem 和依赖项。

导入包

使用常用的文本编辑器将以下内容添加到要在其中使用存储的 Ruby 文件的顶部:

require "azure"

设置 Azure 存储连接

Azure 模块会读取环境变量 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_ACCESS_KEY 以获取连接到 Azure 存储帐户所需的信息。 如果未设置这些环境变量,则在使用 Azure::TableService 之前必须通过以下代码指定帐户信息:

Azure.config.storage_account_name = "<your azure storage account>"
Azure.config.storage_access_key = "<your azure storage access key>"
Azure.config.storage_endpoint_suffix = "core.chinacloudapi.cn"

从 Azure 门户中的经典或 Resource Manager 存储帐户中获取这些值:

  1. 登录到 Azure 门户
  2. 导航到要使用的存储帐户。
  3. 在右侧的“设置”边栏选项卡中,单击“访问密钥” 。
  4. 在显示的“访问密钥”边栏选项卡中,可看到访问密钥 1 和访问密钥 2。 可以使用其中任意一个密钥。
  5. 单击复制图标以将密钥复制到剪贴板。

从经典 Azure 门户中的经典存储帐户中获取这些值:

  1. 登录到 Azure 经典管理门户
  2. 导航到要使用的存储帐户。
  3. 单击导航窗格底部的“管理访问密钥” 。
  4. 在弹出对话框中,会看到存储帐户名称、主访问密钥和辅助访问密钥。 对于访问密钥,可以使用主访问密钥,也可以使用辅助访问密钥。
  5. 单击复制图标以将密钥复制到剪贴板。

创建表

使用 Azure::TableService 对象可用于处理表和条目。 若要创建表,请使用 create_table() 方法。 以下示例创建表或输出存在的错误。

azure_table_service = Azure::TableService.new
begin
    azure_table_service.create_table("testtable")
rescue
    puts $!
end

向表中添加条目

若要添加条目,应首先创建定义条目属性的哈希对象。 请注意,必须为每个实体指定 PartitionKey 和 RowKey。 这些值是条目的唯一标识符,查询它们比查询其他属性快很多。 Azure 存储使用 PartitionKey 将表的实体自动分发到多个存储节点。 具有相同 PartitionKey 的条目存储在同一个节点上。 RowKey 是条目在其所属分区内的唯一 ID。

entity = { "content" => "test entity",
    :PartitionKey => "test-partition-key", :RowKey => "1" }
azure_table_service.insert_entity("testtable", entity)

更新条目

可使用多种方法来更新现有条目:

  • update_entity():通过替换更新现有实体。
  • merge_entity():通过将新属性值合并到现有实体来更新现有实体。
  • insert_or_merge_entity():通过替换更新现有实体。 如果不存在条目,则插入新条目:
  • insert_or_replace_entity():通过将新属性值合并到现有实体来更新现有实体。 如果不存在条目,则插入新条目。

以下示例演示如何使用 update_entity() 更新实体:

entity = { "content" => "test entity with updated content",
    :PartitionKey => "test-partition-key", :RowKey => "1" }
azure_table_service.update_entity("testtable", entity)

使用 update_entity()merge_entity() 时,如果要更新的实体不存在,则更新操作会失败。 因此,如果希望存储某个实体而不用考虑它是否已存在,则应改用 insert_or_replace_entity()insert_or_merge_entity()

处理条目组

有时,有必要成批地同时提交多项操作以确保通过服务器进行原子处理。 若要完成此操作,首先要创建一个 Batch 对象,然后对 TableService 使用 execute_batch() 方法。 以下示例演示在一个批次中提交 RowKey 为 2 和 3 的两个条目。 请注意,此操作仅适用于具有相同 PartitionKey 的条目。

azure_table_service = Azure::TableService.new
batch = Azure::Storage::Table::Batch.new("testtable",
    "test-partition-key") do
    insert "2", { "content" => "new content 2" }
    insert "3", { "content" => "new content 3" }
end
results = azure_table_service.execute_batch(batch)

查询条目

若要查询表中的实体,请使用 get_entity() 方法并传递表名称、PartitionKeyRowKey

result = azure_table_service.get_entity("testtable", "test-partition-key",
    "1")

查询一组条目

若要查询表中的一组实体,请创建查询哈希对象并使用 query_entities() 方法。 以下示例演示如何获取具有相同 PartitionKey的所有条目:

query = { :filter => "PartitionKey eq 'test-partition-key'" }
result, token = azure_table_service.query_entities("testtable", query)
Note

如果结果集太大,一个查询无法全部返回,会返回一个继续标记,可以使用该标记检索后续页面。

查询条目属性的子集

对表的查询可以只检索条目的几个属性。 这种技术称为“投影”,可减少带宽并提高查询性能,尤其适用于大型条目。 请使用 select 子句并传递希望显示给客户端的属性的名称。

query = { :filter => "PartitionKey eq 'test-partition-key'",
    :select => ["content"] }
result, token = azure_table_service.query_entities("testtable", query)

删除实体

若要删除实体,请使用 delete_entity() 方法。 需要传入包含该条目的表的名称、条目的 PartitionKey 和 RowKey。

azure_table_service.delete_entity("testtable", "test-partition-key", "1")

删除表

若要删除表,请使用 delete_table() 方法并传入要删除的表的名称。

azure_table_service.delete_table("testtable")

后续步骤