Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table,其中的 Table 就是本文的主角 Azure Table storage。

Azure Table storage 是一个在云端存储结构化 NoSQL 数据的服务,它不仅存取速度快,而且效费比高。MSDN 上的说法是:成本显著低于传统 SQL!

笔者最近在项目中用 Table storage 实现了一个日志表,在此和大家分享一下 Table storage 的基本用法。

Azure storage account

首先需要说明,对 Blob、Queue、File 和 Table 这些 Azure 提供的存储服务的访问控制都是通过 storage account 来进行的,所以要想使用 Table storage,需要先创建你的 storage account。

具体创建过程,MSDN 上有详细讲解。你需要了解一下 Access keys,因为它就是你访问 storage account 的用户名和密码:

创建Table storage的对象

在使用 Azure Table storage 的相关对象前,我们需要安装对应的包。安装过程其实很简单,只需在 Visual Studi o的 Package Manager Console 中输入:

Install-Package WindowsAzure.Storage

Visual Studio 就会自动安装 WindowsAzure.Storage 包及其依赖的所有包,安装完成后的 packages.config 文件看起来像这个样子:

安装完相关的包以后,我们就可以使用其中的类型了。

CloudStorageAccount 类表示一个 Azure storage account,我们需要先创建它的实例,才能访问属于它的资源。

//注意连接字符串中的xxx和yyy,分别对应Access keys中的Storage account name 和 key。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy");

CloudTableClient 类是 Windows Azure Table Service 客户端的逻辑表示,我们需要使用它来配置和执行对 Table storage 的操作。

CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient();

CloudTable 类表示一张数据表。

我们需要创建一个实例去引用 Table storage 中的一张表,测试用的表名叫”MyLogTable”。

CloudTable logTable = cloudTableClient.GetTableReference("MyLogTable");
// 如果不确定表是否被创建过,可以调用CreateIfNotExists方法。
logTable.CreateIfNotExists();

这样在后面的操作中就可以确保 MyLogTable 表是存在的,有了 logTable 对象我们就可以向表中插入数据了。

但是等等,好像少了点什么。

我们开篇第一句中就说明了,Table storage 存储的是结构化的数据,所以我们还要先定义存储的数据的类型。

定义日志类

在定义我们自己的数据类型时,有一个强制性的要求,必须继承自 TableEntity 类型:

{
public MyLogEntity() { }
public MyLogEntity(string pkey, string rkey)
{
this.PartitionKey = pkey;
this.RowKey = rkey;
} public DateTime LogDate { get; set; }
public string LogMessage { get; set; }
public string ErrorType { get; set; }
}

在我们的设计中,PartitionKey 用来存放产生日志的年份和月份(例如 201607),RowKey 用来存放产生日志的天和时分秒毫秒(例如 160934248492),日志数据主要是 LogDate, LogMessage 和 ErrorType。

把数据插入到Table storage

终于可以向表中插入数据了,先试一下:

DateTime now = DateTime.Now;
string partitionKey = now.ToString("yyyyMM");
string rowKey = now.ToString("ddHHmmssffff");
MyLogEntity logEntity = new MyLogEntity(partitionKey, rowKey);
logEntity.LogDate = now;
logEntity.LogMessage = "test message";
logEntity.ErrorType = "error";
// TableOperation类表示对一个表进行的操作,可以插入一行或多行数据,删除数据,更新数据等。
TableOperation insertOperation = TableOperation.Insert(logEntity);
logTable.Execute(insertOperation);

看起来还不错,我们用 Visual Studio 自带的 Cloud Explorer 查看一下 MyLogTable 中的内容:

OK,数据已经成功插入到 MyLogTable 表中,接下来我们看看如何批量的插入数据。

TableBatchOperation batchOperation = new TableBatchOperation();
for (int i = ; i < ; i++)
{
DateTime now = DateTime.Now;
string partitionKey = now.ToString("yyyyMM");
string rowKey = now.ToString("ddHHmmssffff");
MyLogEntity logEntity = new MyLogEntity(partitionKey, rowKey);
logEntity.LogDate = now;
logEntity.LogMessage = "test message" + i.ToString();
logEntity.ErrorType = (i%) == ? "error" : "warning";
batchOperation.Insert(logEntity);
Thread.Sleep();
}
logTable.ExecuteBatch(batchOperation);

这次我们把 TableOperation 类换成了 TableBatchOperation 类,然后一次插入十条数据。去检查一下结果,OK十条数据全部插入成功!

下面让我们把循环中的10改成200试试:

怎么收到一个 InvalidOperationException 呢?看看红框中的内容,原来批量操作是有一些限制的:

1. 每个批量操作的数据上限是100条记录。

2. 每个批量操作中的数据都必须保持相同的 partition key。

请大家在使用批量操作时务必注意这些限制条件!

查询操作

对于日志数据的操作,最重要的就是查询,我们通过几个具体的用例来介绍 Table storage 的查询操作。

1. 查询所有的记录

这是最简单的查询方法,一般是想要导出全部数据时才会这么干:

TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>();
foreach (MyLogEntity entity in logTable.ExecuteQuery(query))
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey, entity.LogMessage, entity.ErrorType);
}

2.查询某年的某个月的记录

要查询某个月的所有记录也是比较容易的,因为我们设计的 PartitionKey 就代表了某个月份:

TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>().Where(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, ""));
foreach (MyLogEntity entity in logTable.ExecuteQuery(query))
{
//...
}

请注意 TableQuery.GenerateFilterCondition 方法,我们创建了一个过滤条件:PartitionKey 等于“201607”。这个查询会把所有 PartitionKey 为“201607”的记录都找到!

3.查询某一条记录

如果我们已经知道了一条记录的 PartitionKey 和 RowKey,就可以通过这两个条件直接查询到这条记录的详情:

TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, ""),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "")));
foreach (MyLogEntity entity in logTable.ExecuteQuery(query))
{
//...
}

这次我们使用了组合条件,只用到了条件运算操作 TableOperators.And 和 QueryComparisons.Equal,当然你也可以尝试其它的条件类型。唯一要注意的就是: PartitionKey 和 RowKey,QueryComparisons 的操作对象都是字符串。

我们还需要更多的查询条件,比如查询某一天产生的所有日志。在 MyLogTable 表中,这需要查询以”xx”字符串开头的 RowKey。这部分知识,我会单独在一篇文章中和大家分享相关内容,因为它并不像看起来的那么简单。

接下来我们介绍如何更新和删除日志表中的数据,这里只是借用日志表介绍更新和删除操作。

更新记录

TableOperation retrieveOperation = TableOperation.Retrieve<MyLogEntity>("", "");
TableResult retrievedResult = logTable.Execute(retrieveOperation);
MyLogEntity updateEntity = (MyLogEntity)retrievedResult.Result; if (updateEntity != null)
{
updateEntity.LogMessage = "new log message";
TableOperation updateOperation = TableOperation.Replace(updateEntity);
logTable.Execute(updateOperation);
}

以上操作,我们先用 TableOperation.Retrieve 方法获得一条数据的详情,然后更新它的 LogMessage 属性,最后使用 TableOperation.Replace 方法把新的内容更新的到 Table storage 中。

删除记录

删除一条记录和更新一条记录是基本一样的步骤,不同点是把 TableOperation.Replace 方法换成 TableOperation.Delete 方法:

TableOperation retrieveOperation = TableOperation.Retrieve<MyLogEntity>("", "");
TableResult retrievedResult = logTable.Execute(retrieveOperation);
MyLogEntity deleteEntity = (MyLogEntity)retrievedResult.Result;
if (deleteEntity != null)
{
TableOperation deleteOperation = TableOperation.Delete(deleteEntity);
logTable.Execute(deleteOperation);
}

删除表

删除表和创建表一样简单(可比删除一条记录容易多了):

logTable.DeleteIfExists();

总结,本文通过对一个日志表的操作介绍了 Azure Table storage 的一个典型应用场景和基本的使用方法,从操作的代码上看和传统的 sql 表操作差别还是挺大的。希望本文对朋友们了解 Azure Table storage 能有所帮助。

相关阅读:

最全的Windows Azure学习教程汇总

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

Azure File Storage 基本用法 -- Azure Storage 之 File

Azure Table storage 基本用法 -- Azure Storage 之 Table



Azure Table storage 基本用法 -- Azure Storage 之 Table的更多相关文章

  1. Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure File Storage 基 ...

  2. Azure File Storage 基本用法 -- Azure Storage 之 File

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...

  3. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

  4. Windows Azure Storage (6) Windows Azure Storage之Table

    <Windows Azure Platform 系列文章目录> 最近想了想,还是有必要把Windows Azure Table Storage 给说清楚. 1.概念 Windows Azu ...

  5. [Windows Azure] How to use the Queue Storage Service

    How to use the Queue Storage Service version 1.7 version 2.0 This guide will show you how to perform ...

  6. [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传

    <Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...

  7. Windows Azure Storage (20) 使用Azure File实现共享文件夹

    <Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...

  8. Windows Azure Storage (24) 启用Azure Blob日志

    <Windows Azure Platform 系列文章目录> 之前有一个业务需求,客户想知道Azure Storage是否有日志功能,可以检查某个Azure Blob文件在某个时间点被删 ...

  9. [AWS vs Azure] 云计算里AWS和Azure的探究(6) - Amazon Simple Storage Service 和 Microsoft Azure Blob Storage

    这几天Nasuni公司出了一份报告,分析了各个云厂商的云存储的性能,包括Amazon S3,Azure Blob Storage, Google Drive, HP以及Rackspace.其中性能上A ...

随机推荐

  1. Android 利用ImageView显示图片

    Author: Maddock Date: 2015-07-21 因为做算法demo的需要,开发一点安卓的程序. 需求:获取UI中图像中某点的坐标. 参考:http://longshuai2007.b ...

  2. 网页中插入外部视频的几种方法(PC与手机网页通用)

    网页中加入视频的几种方法(PC与手机网页通用) 方法一: <!doctype html> <html> <head> <meta charset=" ...

  3. jq 剪切板

    文章链接 http://www.cnblogs.com/lkxsnow/p/5372665.html http://www.w3cfuns.com/notes/17735/020c2e68a60342 ...

  4. VS 编辑器扩展辅助工具

    [工具]——[扩展和更新]——[联机]输入 C# outline 2015

  5. 高效快捷实用移动开单手持扫描打印一体智能 POS PDA

    PDA数据采集器,是一款移动手持开单设备,它通过WIFI和GPRS连接并访问电脑,从进销存软件中读取数据,实现移动开单,打破电脑开单模式. 它自带扫描器,可直接扫描条码来查找产品,且功能强大.操作简单 ...

  6. dedecms搜索框写法

    <div class="bg_search"> <form id="forms" name="formsearch" ac ...

  7. 压力测试相关之ab命令

    1. 短时压力测试工具 ab 命令(apache的工具) 关键指标: Requests per second:    98.52 [#/sec] (mean)      ###平均每秒的请求数 Tim ...

  8. Ancient Printer[HDU3460]

    Ancient Printer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Tot ...

  9. C++文件操作(fstream)

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  10. Linux 系统查看物理内存使用率的命令脚本,以百分比形式输出。

    想监视系统内存?好像是没法直接得到现成的百分比的,自己取值计算一下吧 totalmem=`free -m | grep 'Mem' | awk '{print $3}'` usedmem=`free ...