WindowsAzure:phpazure的Blob缓存实验

WindowsAzure:phpazure的Blob缓存实验,php,caching,azure,storage,blob,Php,Caching,Azure,Storage,Blob,我正在做一些实验,将站点缓存到blob存储中。 现在我意识到这并没有我预期的那么快。例如,以下代码检查请求站点的缓存版本是否存在,并返回内容: $blobStorageClient = new Microsoft_WindowsAzure_Storage_Blob(); if (!$blobStorageClient->blobExists(self::CONTAINER, $path)) return false; $blobData = $blobStorageClient->

我正在做一些实验,将站点缓存到blob存储中。 现在我意识到这并没有我预期的那么快。例如,以下代码检查请求站点的缓存版本是否存在,并返回内容:

$blobStorageClient = new Microsoft_WindowsAzure_Storage_Blob();
if (!$blobStorageClient->blobExists(self::CONTAINER, $path))
return false;

$blobData = $blobStorageClient->getBlobData(self::CONTAINER, $path);
$metaData = $blobStorageClient->getBlobMetadata(self::CONTAINER, $path);
...

此部分的持续时间始终介于500毫秒和1000毫秒之间(somtime 2000毫秒)。我用Azure Compute Emulator和live storage对其进行了测试。有人知道它为什么这么慢吗?或者它是正常的吗?我能做得更好吗?进行blob缓存是一个好主意吗?

我认为blob存储不适合缓存。它仍然可以在某些情况下使用,但通常情况下,您不希望缓存尽可能快。您应该使用appfabric缓存或内存缓存。在多实例环境中,内存缓存可能听起来很糟糕,但确实有一些情况下您可以使用它,具体取决于您需要什么


关于那个密码。。您在这里进行3个事务(如果存在blob)。您可以尝试立即调用getBlobData,如果出现NotFound错误,则返回false。我不知道php在异常处理方面有多好,但我怀疑它比对blob存储的整个请求慢。

在我看来,代码对blob存储进行了三次往返(当blob存在时)。我对PHP库不太熟悉,但希望有一个方法可以调用,它可以立即提取blob数据和元数据。你可以试着这么做,如果失败了,那就意味着这个斑点不存在。如果成功,请使用该数据


至于计时,我的经验法则是,到存储的往返可能需要大约10-30毫秒,然后当然还有时间传输blob数据,这取决于blob的大小。当然,对于在Windows Azure中运行的代码与同一位置的存储帐户进行对话而言,这是一段时间。

商定的blob存储可能不是应用缓存解决方案。你想过用这个吗

感谢您使用PHPSDK,还有什么其他反馈意见想与我们的工程团队分享吗

TGIF:)


jas

我不知道为什么在你这方面速度如此之慢,但我实际上设法在5毫秒内为不存在的blob获取了一个“false”,在44毫秒内获取了实际数据(实际数据只有几个字节)

每个缓存blob中的数据大小是多少?如果只有几千字节,这应该没有问题,但是任何更大的数据都可能会使缓存变慢,因为每次都必须通过网络检索数据

对于分布式缓存,请选中。 对于本地VM上的缓存,请使用文件系统(http://phpazurecontrib.codeplex.com,检查本地资源)或使用可用的WinCache扩展

作为参考:检查blob是否存在在代码示例中不是必需的,只需尝试以下结构:

    $blobData = null;
$metaData = null;

try {
    $blobData = $blobStorageClient->getBlobData($container, $path);
    $blobStorageClient->getBlobMetadata($container, $path); 
} catch (Microsoft_WindowsAzure_Exception $ex) {
    return false;
}

return $blobData;
这将减少到存储的一次往返。

2012年5月的更新

如果其他人遇到了这个话题(就像我一样),那么自写这篇文章以来,Azure中的内存缓存发生了一些变化。(而内存缓存似乎是用户回答这个问题的方式)

Azure现在有自己的缓存,但PHP不支持它。因此,这仍然不是一个真正的选择(截至2012年5月)


因此,在撰写本文时,最好的选择(也是我正在使用的)是使用memcached。然后,所有PHP文档化的解决方案仍然有效,并且有部署memcached at的示例-这使用一个脚手架在服务器上安装memcached,然后您可以使用PHP的memcache或memcached进行访问。

这是“慢”的,因为Blob存储不是为您想要的缓存解决方案的那种随机IO而设计的,使用Azure storage帮助共享缓存,但如果缓存足够小,请使用本地存储将其保存在本地文件存储中或内存中。问题是,我希望所有实例的共享缓存能够通过工作角色轻松清除特定的缓存项。我不知道phpazure对appfabric缓存的支持有多大,我也考虑过。你认为我会在5GB blob缓存中遇到更大的问题吗?Thx对于这个非常有趣的提示,我今天就试试。我认为这可能是最好的解决方案之一,因为我使用的是支持memcached native的symfony框架。对于提供SDK的Thx,它非常有用。每个blob介于10kB和100kB之间。我会用你优化的结构做速度测试。谢谢。