在Azure中保存数据的最简单方法 - 推荐选项?

时间:2013-06-27 12:53:56

标签: asp.net-mvc-4 azure

我正在给Azure一个MVC4,并且有我能想到的最简单的数据存储要求。每次我的控制器被击中时,我想将日期时间和其他一些细节记录到某个位置。每月最多可能只有几千次点击。然后我想查看一个页面,告诉我有多少次点击(附加行)。

使用Server.MapPath ...写入文件夹中的文本文件会产生权限错误,并且由于其分布式特性,似乎无法实现。获得一个完整的SQL实例每月大约10美元。使用表或blob存储听起来很有希望,但是设置服务并学习使用它们似乎远不如基本文件或数据库那么简单。

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

使用TableStorage。对于所有意图和目的而言,它是免费的(无论如何,对于这个数量的音量来说,它只是你网络角色的一小部分)。

至于你认为它有多复杂,它实际上并非如此。看看这篇文章就可以了。 http://www.windowsazure.com/en-us/develop/net/how-to-guides/table-services/#create-table

//Create a class to hold your data
public class MyLogEntity : TableEntity
{
    public CustomerEntity(int id, DateTime when)
    {
        this.PartitionKey = when;
        this.RowKey = id;
    }

    public MyLogEntity () { }

    public string OtherProperty { get; set; }
}


//Connect to TableStorage
var connstr = CloudConfigurationManager.GetSetting("StorageConnectionString") //Config File
var storageAccount = CloudStorageAccount.Parse(connstr);

// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

// Create the table if it doesn't exist.
var table = tableClient.GetTableReference("MyLog");
table.CreateIfNotExists();


var e= new MyLogEntity (%SOMEID%, %SOMEDATETIME%);
e.OtherValue = "Some Other Value";

// Create the TableOperation that inserts the customer entity.
var insertOperation = TableOperation.Insert(customer1);

// Execute the insert operation.
table.Execute(insertOperation);

答案 1 :(得分:2)

增加@Eoin的答案:使用表存储时,根据您指定的分区键将表分段为分区。在分区中,您可以搜索特定行(通过行键),也可以扫描分区以查找一组行。完全匹配搜索非常非常快。分区扫描(或表扫描)可能需要一段时间,尤其是对于大量数据。

在您的情况下,您需要行数(实体)。存储您的行似乎非常简单,但您将如何统计计数?白天?按月?按年?可能值得将分区与日期或月份对齐,以便更快地进行计数(没有函数可以返回表或分区中的行数 - 您最终会查询它们。)

一个技巧是在每次编写特定实体时将累积值保留在另一个表中。这将非常快:

  • 写实体(类似于Eoin说明的)
  • Counts表中读取与您编写的行类型相对应的行
  • 增加并写回值

现在,您可以通过非常快速的方式在任何给定时间检索计数。无论您选择什么,您都可以计算个别日期,特定月份。为此,您可以将特定日期作为分区键,从而可以非常快速地访问包含累计计数的正确实体。