我正在做一些将网站缓存到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缓存是一个好主意吗?
答案 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来访问。