我正在尝试在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'));
我明白了:
<00> 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来自哪里
答案 0 :(得分:20)
问题是Redis客户端for Node默认情况下会将响应转换为JavaScript字符串。
我在创建客户端时将return_buffers
选项设置为true
来解决此问题。
var client = redis.createClient(7000, '127.0.0.1', {'return_buffers': true});
有关详细信息,请参阅here。
答案 1 :(得分:2)
我无法弄清楚如何存储二进制字符串。
以下是我的解决方法:
数据是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);
});
这并不理想,因为您每次都必须进行转换,但它似乎有效。
答案 2 :(得分: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');
});
答案 3 :(得分:0)
对我来说有用的是使用data.toString('binary')
,如果它是Buffer
。另外,请确保不要将其重新解释为utf-8
,还要binary
。
答案 4 :(得分:0)
我在该主题上找到了这篇文章,该文章解释了这样做的含义,我强烈建议您在走这条路之前(不管编程语言如何)先阅读。
http://qnimate.com/storing-binary-data-in-redis/
总而言之,由于Redis是内存中的键/值存储,因此明智的做法是,不要在Redis中存储诸如图像之类的可能较大的值,因为这样会很快耗尽可用内存并降低Redis实例的性能。最好在Redis中存储文件的位置,而不是在文件本身中存储。
答案 5 :(得分:0)
这篇文章很旧,但只是一个更新的答案。正如另一个答案所述,所有 Node.js Redis 库都将数据作为 utf8 字符串返回,因为这是人们通常需要的。像 ioRedis 这样的 Node.js Redis 库也提供了将数据作为缓冲区获取的替代方法。例如 redis.getBuffer
而不是 redis.get
。