エンコードされていないバイナリデータを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にの視点から同じオーバーヘッドを持っています。ベース64のエンコーディング/デコード(そして、フードの下では、base64データはjsonエンコード/デコードされます)の消費サイクルは、バイナリアプローチを全体的に先取りします。
編集:Erlangバックエンドの制限により、Riakバイナリオブジェクト(this postを参照)に格納されるデータの上限が50mbあることにも注意してください。現実には、どこにいても、それらのイメージをどのように格納しているのか考え直すことができます。そのようなイメージに頻繁にアクセスすると、パイプ上に送信するデータがたくさんあります。おそらく良い考えです。
ありがとうございました。私はbase64_encodeに傾いていた。自分のやり方があれば、私はRiakに生の画像データを保存しません。それらがオンラインでアクセスされる画像であれば、それらをRackspace Cloud Filesに入れ、Riakにその場所の記録を入れます。もしそれらがプライベートなファイルだったら、おそらくfusion-ioカード付きの専用サーバをいくつか取得し、そこに画像を保存して同じリンクをすることを考えていたでしょう。しかし、今のところ、私は[私たちの]オプションで行くつもりです。乾杯。 –
1MBは、Riakバイナリオブジェクトに格納されているデータの推奨限度です。それ以上のものはRiak CSを考慮する必要があります。 –