データの保存に node-redis を使用している場合は、Buffers を直接処理するため、単純に client.set(key, buff) または client.append(key, buff) を実行できるため、その必要はありません (したくありません)。任意の変換を行います。
Node.js (Kevin から簡略化)
var zlib = require('zlib');
var redis = require("redis");
var rc = redis.createClient(null, null, {detect_buffers: true}); // allow Buffers
var message = new Buffer('My message');
zlib.deflate(message, function (err, deflated) {
if (err) return console.error(err);
rc.set("testkey", deflated, function (err, result) {
if (err) return console.error(err);
rc.quit();
});
});
Ruby コード (上記の Kevin からコピー)
require 'zlib'
require 'rubygems'
require 'redis'
redis = Redis.new
def inflate(buffer)
zstream = Zlib::Inflate.new
buf = zstream.inflate(buffer)
zstream.finish
zstream.close
buf
end
value = redis.get("testkey")
puts inflate(value)
それは値を適切に取得することで機能しますが、Node.jsコードを使用する.toString('binary')
ように変更すると、前述のようにRubyのデコードが最初に壊れます。
toString('binary') がデータをいじることを示す例を次に示します
console.log(deflated);
console.log(new Buffer(deflated.toString('binary')));
したがって、 Buffer.toString('binary') が V8 Buffer コードに入ると信じているため、 Buffer.toString('binary') がどのような変換を行っているのかわかりません。
しかし、Node.js でまだそれを読み取ることができる場合は.toString('binary')
、バッファを redis クライアント set メソッドに渡すだけで適切に保存されます。
すると、バイナリとして保存され、上記のようなコードを使用して ruby で正しく読み取ることができます。
node.js コードについては、バイナリとして適切に保存したら (set 呼び出しで直接 Buffer を使用)、それを取得するには:
var rc = redis.createClient(null, null, {detect_buffers: true}); // allow Buffers
rc.get(new Buffer(key), function (err, buff) { // use a Buffer for the key
// buff is a Buffer now
});
node-redis に対して detect_buffers をオンにすることで、Buffer をキーとして渡すと、Buffer として取得され、変換されません。
別の方法としてreturn_buffers = true
オプションをdetect_buffers
使用することもできますが、バッファ データと非バッファ データの両方に同じクライアントを使用できるようにしたいと思います。
PS。Ruby gem が 1.x (2.x でバイナリ修正が追加された) のような古いバージョンではなく、最新バージョンのいずれかを使用していることを確認してください。