如果您想使用 PHP 客户端将未编码的二进制数据存储到 Riak 中,您将需要使用RiakBucket::newBinary()
它。RiakBucket::getBinary()
$image = file_get_contents("images/TagLabs-Logo-White-240x60.png");
$md5 = md5($image);
$riak->bucket("test")
->newObject("image_base64", base64_encode($image))
->store();
$riak->bucket("test")
->newBinary("image_raw", $image, 'image/png')
->store();
$b64Read = $riak->bucket("test")->get("image_base64");
echo "B64 md5 comparison: original=$md5, b64=".md5(base64_decode($b64Read->getData()))."\n";
$rawRead = $riak->bucket("test")->getBinary("image_raw");
echo "Raw md5 comparison: original=$md5, raw=".md5($rawRead->getData())."\n";
产生输出:
B64 md5 comparison: original=6749cfaf1516b01db9792e119d53177a, b64=6749cfaf1516b01db9792e119d53177a
Raw md5 comparison: original=6749cfaf1516b01db9792e119d53177a, raw=6749cfaf1516b01db9792e119d53177a
在我的性能测试中,从 Riak 的角度来看,这两种方法的开销基本相同。在 base64 编码/解码上花费周期(加上在后台,base64 数据然后是 json 编码/解码)使二进制方法总体领先。
编辑:另请注意,由于 Erlang 后端的限制,存储在 Riak 二进制对象(参见这篇文章)中的数据有一个 ~50mb 的上限。实际上,如果您接近该目标,您可能需要重新考虑如何存储这些图像,如果您经常访问这些图像,则需要在管道上发送大量数据,例如 NFS 或其他本地文件系统缓存可能是一个更好的主意。