如何使用节点在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