如何使用节点在redis中存储二进制对象?
我正在尝试在redis中保存一个二进制对象,然后将其作为图像提供回来。
这里是我用来保存数据的代码:
var buff=new Buffer(data.data,'base64'); client.set(key,new Buffer(data.data,'base64'));
以下是转储数据的代码:
client.get(key,function(err,reply){ var data = reply; response.writeHead(200, {"Content-Type": "image/png"}); response.end(data,'binary'); });
数据的前几个字节似乎已损坏。 幻数是不正确的。
做了一些实验:
当我做到以下几点:
var buff=new Buffer(data.data,'base64'); console.log(buff.toString('binary'));
我得到这个:
0000000:c289 504e 470d 0a1a 0a00 0000 0d49 4844
当我这样做
var buff=new Buffer(data.data,'base64'); console.log(buff);
我得到以下内容:
缓冲液89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00
我不确定c2是从哪里来的
问题是Node的Redis客户端默认将响应转换为JavaScriptstring。
我通过在创build客户端时将return_buffers
选项设置为true
来解决这个问题。
var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
在这里看到更多的细节。
我无法弄清楚如何获得二进制string存储。
这是我的解决方法:
数据是base64string中的数据
client.set(count,data);
提供数据:
client.get(last,function(err,reply){ var data = reply; response.writeHead(200, {"Content-Type": "image/png"}); var buff=new Buffer(data,'base64'); response.end(buff); });
这是不理想的,因为你必须每次都进行转换,但似乎工作。
return_buffers
的问题是当你不使用纯缓冲区数据的时候,你将不得不做一些事情来将其他缓冲区转换为string。 虽然detect_buffers
可能是一个选项,但它太不可靠了。
如果你不介意额外的计算周期。 你也可以尝试:
// convert your buffer to hex string client.set(key, mybuffer.toString('hex')); // create a new buffer from hex string client.get(key, function (err, val) { var bin = new Buffer(val, 'hex'); });
如果它是一个Buffer
那么对我来说就是使用data.toString('binary')
。 另外请确保不要将其重新解释为utf-8
,而且也是binary
。