21

我正在尝试将二进制对象保存在 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 来自哪里

4

6 回答 6

26

问题是 Node 的 Redis 客户端默认将响应转换为 JavaScript 字符串。

我通过在创建客户端时设置return_buffers选项来解决这个问题。true

var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});

有关更多详细信息,请参见此处

于 2014-05-31T01:21:30.403 回答
2

我无法弄清楚如何获取二进制字符串来存储。

这是我的解决方法:

其中data是base64字符串中的数据

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);
});

这并不理想,因为您每次都必须进行转换,但它似乎有效。

于 2013-12-23T16:40:50.247 回答
1

问题return_buffers是当您不使用纯缓冲区数据时,您将不得不做一些事情将其他缓冲区转换为字符串。虽然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');
});
于 2015-02-06T20:58:10.707 回答
0

我发现这篇文章解释了这样做的含义,我强烈建议在走这条路之前阅读这篇文章(不管编程语言如何)。

http://qnimate.com/storing-binary-data-in-redis/

总而言之,由于 Redis 是内存中的键/值存储,因此明智的做法是不要在 Redis 中存储可能较大的值(例如图像),因为这样会很快耗尽可用内存并降低 Redis 实例的性能。最好将文件的位置存储在 Redis 中,而不是文件本身。

于 2019-12-18T17:15:32.660 回答
0

对我有用的data.toString('binary')是使用Buffer. 还要确保不要将其重新解释为utf-8,而应将其重新解释为binary

于 2017-04-03T05:11:13.127 回答
0

这篇文章很旧,但只是一个更新的答案。正如另一个答案所述,所有 Node.js Redis 库都将数据作为 utf8 字符串返回,因为这是人们通常需要的。Node.js Redis 库(如ioRedis)也提供了将数据作为缓冲区获取的替代方案。例如redis.getBuffer,而不是redis.get.

于 2021-06-26T07:39:17.743 回答