我已经使用Basho Riak几个星期了。我只需要存储字符串数据。
然而,我正在考虑使用它来存储图像,我想知道如何使用PHP客户端来实现这一点。
以下是存储数据的基本代码:
require_once('riak-php-client/riak.php');
# Connect to Riak
$client = new RiakClient('127.0.0.1', 8098);
# Choose a bucket name
$bucket = $client->bucket('test');
# Supply a key under which to store your data
$person = $bucket->newObject('string_key', 'string_data');
# Save the object to Riak
$person->store();
我是否只对图像进行base64_encode编码,然后存储结果字符串?!或者有更好的方法吗?!
提前谢谢。
如果要使用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或其他本地文件系统缓存可能是一个更好的主意。