如何使用Azure表存储进行大量查找

时间:2017-07-19 09:43:30

标签: azure azure-storage azure-functions azure-table-storage azure-web-app-service

我有一个2 GB哈希的存储空间,我想用公共Api检查。

使用案例

我想说我想创建一个API来检查我的产品是否知道某个人。 为了尊重个人隐私,我不想上传他的姓名,会员ID等。 所以我决定仅上传组合的Informationen的哈希来识别他。 现在我有2 GB(6 * 10 ^ 7)的SHA256哈希值,想要以疯狂快速检查它们。

此API应托管在azure中。

在阅读azure存储帐户的文档后,我认为Azure表存储是正确的存储解决方案。 我会将 base64哈希设置为分区键,并将行键保留为空

问题

  1. 首先,Azure Table是否适合该作业存储?
  2. 以下是不同的表现:
    1. 分区键:base64 hash,row key:empty
    2. 分区键:'上传ID',行键:empbase64哈希
  3. 访问槽键的时间是否取决于表的大小?
  4. 检查分区键是否存在的最快方法是什么? 我认为我天真的第一次尝试并不是最好的方式。

    if(members.Where(x => x.PartitionKey == Convert.ToBase64String(data.Hash))。AsEnumerable()。Any()) {         return req.CreateResponse(HttpStatusCode.OK," Found Hash"); }其他 {         return req.CreateResponse(HttpStatusCode.NotFound," Don找不到Hash"); }

  5. 如何上传2 GB的哈希值? 我想上传一个大文件并在每个256位后使用azure函数进行拆分并将值添加到azure存储中。或者更好的想法?

2 个答案:

答案 0 :(得分:3)

我对此的看法:

  1. 如果您需要的唯一查询是"请检查现有哈希是否存在" (并在需要时检索其详细信息),然后表存储是完美匹配。密钥查找快速而便宜,2 GB不算什么。

  2. Hash提供了最多样化,所以我会将它用于分区键。行键可以是任何东西。如果Upload Id从未用于(范围)查找,请不要将其用作密钥。

  3. 使用正确的分区键,查找时间应保持不变。

  4. 如果您的意思是需要检查用户哈希是否存在,只需按分区键+行键检索一行。这是最快的操作。请参阅"检索单个实体" here

  5. 表存储支持批量插入。同样,2GB并不多,您可能花了更多时间来提问这个问题,而不是您的上传需要:)

答案 1 :(得分:0)

我看到这是用Azure-Functions标记的,所以我将添加Azure-Functions让你直接绑定到表存储。见https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table

您甚至可以直接绑定到特定实体。 function.json看起来像:

{
    "name": "<Name of input parameter in function signature>",
    "type": "table",
    "direction": "in",
    "tableName": "<Name of Storage table>",
    "partitionKey": "<PartitionKey of table entity to read - see below>",
    "rowKey": "<RowKey of table entity to read - see below>",
}