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

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 的用户名和密码:

1

创建Table storage的对象

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

Install-Package WindowsAzure.Storage

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

2

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

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 中的内容:

3

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

复制代码

TableBatchOperation batchOperation = new TableBatchOperation();
for (int i = 0; i < 10; 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%2) == 0 ? "error" : "warning";batchOperation.Insert(logEntity);Thread.Sleep(10);
}
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, "201607"));
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, "201607"),TableOperators.And,TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "161148372454")));
foreach (MyLogEntity entity in logTable.ExecuteQuery(query))
{//...
}

复制代码

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

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

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

更新记录

复制代码

TableOperation retrieveOperation = TableOperation.Retrieve<MyLogEntity>("201607", "161148372454");
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>("201607", "161148372454");
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

 


 

本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网

了解低门槛高效率的快速开发工具,请前往活字格低代码开发平台

了解可嵌入您系统的在线 Excel,请前往SpreadJS纯前端表格控件

了解可嵌入式的商业智能和报表软件,请前往Wyn Enterprise

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Azure 存储-Blob

1. 前言 本文是根据Azure文档与本人做了验证之后写的。 如果想下载微软官网的demo&#xff0c; 请前往github https://github.com/Azure-Samples/storage-blob-dotnet-getting-started 2. 介绍 Azure Blob是存储很大空间的服务&#xff0c;能允许存储与访问通过http或https。…

蜗牛星际ABCD款,这几款的区别你知道吗?

前言 本次文章有可能篇幅会超长&#xff0c;由于全部内容&#xff0c;可能导致万字长文&#xff0c;所以&#xff0c;本篇已经适当做了精简&#xff0c;只针对我目前拥有的蜗牛进行一些介绍&#xff0c;会附带一些教程链接。 每一个功能的实现&#xff0c;以后我都会单独写详…

蜗牛星际 --【功耗测量】

蜗牛星际b单千兆 正面 测量对象&#xff1a;蜗牛星际b单千兆 配置&#xff1a; j1900 16g 固态 4g ddr3l 内存 关机功耗 蜗牛星际待机功耗 蜗牛星际关机的情况下待机功耗为0.6w&#xff0c;一个月消耗不到两毛四分&#xff0c;一年不到三块钱。 开机功耗 未挂硬盘的情况下…

蜗牛星际:NAS从入门到放弃

预警1&#xff0c;蜗牛矿渣大批量上市是2019年3月的事情了。我写这个大概是2019年10月前后。我挑的最好的时候下手&#xff0c;C款全装只花了245包邮。现在由于市面上货量减少&#xff0c;价格上涨&#xff0c;已经没有原来那么高的性价比了。就连单卖的机箱也从原来的50包邮涨…

Dynamics 365 CRM 开发架构简介

目录 概览 名词解释连接到Dynamics 365 CRM Web APIOrganization service选择 - Web API vs. Organization service扩展服务端扩展应用端正文 Dynamics 365 CRM提供了多种编程模型&#xff0c;你可以灵活地按需选用最佳模式。 本文是对Dynamics 365 CRM编程模型的综述。 回…

Azure手把手系列 1:微软中国公有云概述

很久没有写文章了&#xff0c;主要也是疏于自己的懒惰&#xff0c;对于IT技术的放弃&#xff0c;但我相信浪子回头金不换&#xff0c;所以我又回来了。 相信现在还在泡博客的还在做IT的&#xff0c;或多或少都听过云、私有云及公有云的概念&#xff0c;那么今天给大家分享的是微…

Azure手把手系列 2:微软中国云服务介绍

在前面的文章中&#xff0c;我们已经了解到Azure有两种&#xff0c;分别是由微软直营的国际版&#xff0c;以及微软中国委托21世纪互联运营的国内版&#xff0c;两种Azure存在一定差异&#xff0c;并且数据不互通、帐号以及计费不统一。所以在选择微软公有云的时候也需要注意&a…

Azure手把手系列 3:把IT的钱花在刀刃上

对于Azure以及公有云的了解&#xff0c;可谓是永无止境的&#xff0c;用一句客户的话来说就是Azure是大海&#xff0c;只要你往前航行&#xff0c;一定能时不时的发现宝藏&#xff1b;Azure好比是一座冰山&#xff0c;当你以为你已经对Azure很熟悉了&#xff0c;其实这只是冰山…

Azure手把手系列 4:深入了解Azure 一块钱当三块用

通过前面的文章&#xff0c;相信大家对Azure有了一个基础的认识&#xff0c;接下来&#xff0c;我们再来看下作为企业&#xff0c;选择公有云服务最重要的因素之一 价格。我们都知道所谓公有云&#xff0c;就是要让IT资源变成我们生活中类似于水电气的资源&#xff0c;按需使用…

【Python CheckiO 题解】Feed Pigeons

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

使用VS code 创建 Azure Functions,从blob触发,解析,发送至Service Bus

场景: 某设备定时于每天23&#xff1a;00左右将一天的运行日志.devicelogtxt上传到Azure Blob&#xff0c;期待Blob文件上传后, 自动通过Azure Functions 解析文件并将文件内容写入到服务总线Service Bus的队列中。 上传的文件格式为&#xff1a; 步骤&#xff1a; 下载并安装…

Power Platform之Power Automate新增RPA功能

​ 什么是RPA RPA&#xff08; Robotic Process Automation 机器人流程自动化软件&#xff09;&#xff0c;是一种新型的人工智能的虚拟流程自动化机器人。RPA的核心是通过自动化、智能化技术来“替代人”进行重复性、低价值、无需人工决策等固定性流程化操作&#xff0c;从而…

Hyper-V第1代虚拟机和第2代虚拟机特性对照表

本文《Hyper-V第1代虚拟机和第2代虚拟机特性对照表》系小编在小伟博客看到的文档&#xff0c;转载给大家一起学习。 在 Windows Server 2012 R2 和 Windows 8.1 中内置的 Hyper-V 功能&#xff0c;新增了一种“第二代”虚拟机&#xff0c;从虚拟硬件的层面进行了提升&#xff0…

【转】五大方法,彻底永久关闭win10自动更新的方法【已验证有效】

自从微软大面积使用某员工后&#xff0c;思路越来越奇葩了&#xff0c;前天工作没做完&#xff0c;放在那里&#xff0c;第二天毫无羞耻的就给你重启了&#xff0c;那一瞬间&#xff0c;真想拿dollar到对面slay。于是就有下文&#xff0c;大部分内容是从网上摘录、归纳起来的。…

【Python CheckiO 题解】Probably Dice

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

Dynamics CRM 2016 安装

Dynamics CRM 2016 安装 CRM 2016出来了一段时间了&#xff0c;一直也没机会尝试一下&#xff0c;现在再测试ADFS的时候顺手装一个测试环境&#xff0c;记录一下整个安装配置流程。 首先准备好windows 2012 std&#xff0c;sql server 2014&#xff0c; dynamics crm2016安装…

【Python CheckiO 题解】Largest Rectangle in a Histogram

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

Dynamics 365 on-premises 安装

安装Dynamics 365环境配置要求&#xff1a; 系统版本&#xff1a;Windows Server 2016 SQL 版本&#xff1a; Microsoft SQL Server 2016 SP2 Dynamics 365 版本&#xff1a;CRM9.0-Server-CHS-amd64 安装步骤&#xff1a; 一.在虚拟机安装Windows Server 2016 二.安装好…

【Python CheckiO 题解】Date and Time Converter

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…