WindowsAzure:使用phpazure进行Blob缓存实验

时间:2011-02-11 15:19:46

标签: php caching azure storage blob

我正在做一些将网站缓存到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 2000ms)。我使用PHP Azure SDK,Azure Compute Emulator和实时存储进行了测试。有人知道它为什么这么慢,或者它是否正常,我能做得更好,做blob缓存是一个好主意吗?

5 个答案:

答案 0 :(得分:1)

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

关于那段代码..你在这里做3个交易(如果blob存在的话)。您可以尝试立即调用getBlobData,如果NotFound错误返回false。我不知道php有异常处理有多好,但我怀疑它比blob存储的整个请求慢。

答案 1 :(得分:1)

同意blob存储可能不是应用缓存解决方案。你有没有想过用这个? http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin

感谢您使用PHP SDK,以及您想与我们的工程团队分享的任何其他反馈?

TGIF:)

JAS

答案 2 :(得分:1)

我不确定为什么它在你的结尾这么慢,但实际上我设法在5ms内对不存在的blob获得'false'而在44ms中实际数据(其中实际数据只有几个字节)

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

对于分布式缓存,请检查http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin。 要在本地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;

这将减少一次往返存储。

答案 3 :(得分:0)

在我看来,代码正在对blob存储进行三次往返(当blob存在时)。我对PHP库并不熟悉,但希望有一种方法可以调用,它会立即下拉blob数据和元数据。您可以尝试这样做,如果失败,则意味着blob不存在。如果成功,请使用该数据。

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

答案 4 :(得分:0)

2012年5月更新

如果其他人遇到这个主题(正如我所做的那样),那么在Azure编写之后,Azure中就会出现内存缓存的动作。 (并且内存缓存为用户提供了解决此问题的方法)

Azure现在拥有自己的缓存,但它在PHP中并不是本机支持的。所以这仍然不是一个选择(截至2012年5月)。

因此,在撰写本文时,最好的选择(以及我正在使用的选项)是使用memcached。然后所有PHP记录的解决方案仍然有效,并且有一些在https://github.com/interop-Bridges/Windows-Azure-PHP-Scaffolders/tree/master/Memcached部署memcached的例子 - 这使用一个脚手架在服务器上安装memcached,然后你可以使用PHP的memcache或memcached来访问。