【问题标题】:Redis saving strings as buffers on some OSs, not others?Redis 在某些操作系统上将字符串保存为缓冲区,而不是其他操作系统?
【发布时间】:2012-01-09 21:13:13
【问题描述】:

我在 Ubuntu 11.10 上将 Redis 2.2.11 与 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 让调试变得非常困难!

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

更新:如果没有在 CentOS 5.7 上指定编码,它也可以正常工作。这是 Ubuntu 特有的吗?是否有系统范围的修复?

【问题讨论】:

    标签: javascript macos node.js ubuntu redis


    【解决方案1】:

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

    Pure Javascript 对 Unicode 友好,但对二进制数据不友好。什么时候 处理 TCP 流或文件系统,有必要处理 八位字节流。 Node 有多种策略用于操作、创建、 并使用八位字节流。

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

    Buffer 对象是全局的。

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

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

    【讨论】:

      【解决方案2】:

      由于您没有指定编码,它不知道在打印时使用什么编码。使用以编码为参数的 toString 函数来正确记录它。

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

      【讨论】:

      • 谢谢!但是,为什么这在我的 MacOS 系统上没有发生呢?有没有我可以使用的全局编码选项?
      • 如果没有在 CentOS 5.7 上指定的编码,它也可以正常工作。这是操作系统范围的东西吗?如果是这样,我该如何在 Ubuntu 中更改它?
      • 我会说最好只指定编码,这样可以保证在所有平台上都可以工作。
      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 2013-03-18
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多