Redis将字符串保存为某些操作系统的缓冲区,而不是其他操作系统

Redis saving strings as buffers on some OSs, not others?

本文关键字:操作系统 缓冲区 其他 Redis 保存 字符串      更新时间:2023-09-26

我正在使用Redis 2.2.11与Ubuntu 11.10上的Node,我正在保存一个字符串,但它被返回为缓冲区。

    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> ]

为什么它以字符串的形式进入,而以Buffer的形式出来?缓冲区使调试变得非常困难!

在我的本地设置(MacOS 10.6与Redis 2.2.14)中,检索到的数据打印为字符串,很好。我想找到一个在两个系统上都有效的解决方案。

UPDATE:在CentOS 5.7上没有指定编码的情况下也可以正常工作。这是Ubuntu特有的吗?是否有一个全系统的修复?

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

纯Javascript对Unicode友好,但对二进制数据不友好。当处理TCP流或文件系统时,有必要进行处理八隅体流。Node有几种策略来操作、创建、和消费八位元流。

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

Buffer对象是全局的

在buffer和JavaScript字符串对象之间转换需要一个显式编码方法。

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

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

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