随机访问流Azure块存储

时间:2019-04-25 16:37:44

标签: c# azure azure-blob-storage

是否可以直接向Azure Blob或Azure Block Storage Blob创建流对象。

IE

# Base tables
SELECT * FROM queue;
SELECT * FROM job;
SELECT * FROM queue_job;

# Jobs needing a reservation
SELECT j.*
FROM job j
WHERE NOT EXISTS (SELECT j.id FROM queue_job qj WHERE qj.job_id = j.id);

 # Reserved Queues
 SELECT q.*, qj.*, j.* FROM queue q 
 JOIN queue_job qj ON (qj.queue_id = q.id)
 JOIN job j ON (j.id = qj.job_id)
 WHERE NOW() BETWEEN qj.startAt AND qj.endAt;

 # Historic Reservations
 SELECT q.*, qj.*, j.* FROM queue q 
 JOIN queue_job qj ON (qj.queue_id = q.id)
  JOIN job j ON (j.id = qj.job_id)
 WHERE NOW() > qj.endAt;

 # Available Queues is ALL active queues EXCEPT Reserved Queues
 SELECT q.* FROM queue q WHERE q.status = 1 AND q.id NOT IN
    (SELECT q.id 
     FROM queue q JOIN queue_job qj ON (qj.queue_id = q.id)
     WHERE NOW() BETWEEN qj.startAt AND qj.endAt);

这将允许进行一些很棒的交互,例如将数据库索引存储在蔚蓝的blob中,而无需将其拉到本地。

2 个答案:

答案 0 :(得分:1)

不确定是否可以回答您的问题,但是您可以从blob读取一定范围的字节。直接使用REST API时,可以在Rangex-ms-range标头中指定要读取的字节。

使用C#SDK时,您可以使用DownloadRangeToStream方法,例如:

        using (var ms = new MemoryStream())
        {
            long offset = 200;
            long bytesToRead = 1024;
            blob.DownloadRangeToStream(ms, offset, bytesToRead);
        }

答案 1 :(得分:0)

如果您的问题是“我可以将流与Azure Blob一起使用”,是为了避免在任何时候都需要将整个Blob的大小保存在内存中,那么答案是肯定的。

例如,根据answer here,在读取块Blob时,可以使用诸如CloudBlob.OpenReadAsync之类的方法将Blob作为流句柄进行访问。默认缓冲区大小为4MB,但可以通过StreamMinimumReadSizeInBytes之类的属性进行调整。在这里,我们将Blob流复制到另一个打开的输出流:

using (var stream = await myBlockBlob.OpenReadAsync(cancellationToken))
{
    await stream.CopyToAsync(outputStream);
}

类似地,您可以write a stream直接进入Blob存储:

 await blockBlob.UploadFromStreamAsync(streamToSave, cancellationToken);