2011-11-30 82 views
4

我在Ubuntu 11.10上使用Redis 2.2.11和Node,并且我保存了一个字符串,但它被作为缓冲区返回。Redis在某些操作系统上将字符串保存为缓冲区,而不是其他操作系统?

id = 1234; 
    console.log('data', data); 
    client.hmset("user:" + id, "name", data['name']); 
    client.hmget('user:' + id, "name", function(err, d) { 
     console.log('data retrieved', d); 
    }); 

这将产生在控制台上执行以下操作:

data { name: 'RealServer' } 
data retrieved [ <Buffer 41 6e 6e 61 52 65 61 6c 53 65 72 76 65 72> ] 

为什么要在一个字符串,出来作为缓冲? 缓冲区使调试非常困难!

在我的本地设置(使用Redis 2.2.14的MacOS 10.6)上,检索到的数据打印为字符串,很好。我想找到一个可以继续在两个系统上工作的解决方案。

更新:它也工作正常,没有在CentOS 5.7指定的编码。这是特定于Ubuntu的东西吗?是否有全系统修复?

回答

0

参见:http://nodejs.org/docs/v0.3.1/api/buffers.html

纯JavaScript是Unicode友好的,但不是很好的二进制数据。当处理TCP流或文件系统的 时,需要处理 八位字节流。节点有几个策略来操作,创建,消耗八位组流。

原始数据存储在Buffer类的实例中。 A缓冲区类似于整数数组,但对应于V8堆外部的原始内存区域分配 。缓冲区不能调整大小。

Buffer对象是全局的。

缓冲器和JavaScript字符串对象之间的转换需要一个 明确的编码方法。

因为你没有指定编码,它显示为默认的原始数据。你可以使用buffer.toString来产生一个标准的JS字符串。

0

由于您尚未指定编码,因此在打印时不知道使用哪种编码。使用带编码的toString函数作为参数来正确记录它。

client.hmget('user:' + id, "name", function(err, d) { 
    console.log('data retrieved', d.toString('utf8')); 
}); 
+0

谢谢!但是,为什么在我的MacOS系统上不会发生这种情况?是否有我可以使用的全局编码选项? – flossfan

+1

如果没有在CentOS 5.7上指定编码,它也可以正常工作。这是OS范围内的事情吗?如果可以,我如何在Ubuntu中更改它? – flossfan

+0

我会说只是指定编码更好,这样它就能保证在所有平台上都能正常工作。 – DHamrick