Redis сохраняет строки как буферы в некоторых ОС, а не в других? - PullRequest
4 голосов
/ 30 ноября 2011

Я использую Redis 2.2.11 с Node в Ubuntu 11.10, и я сохраняю строку, но она возвращается как Buffer.

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

Почему он входит как строка и выходит как буфер?Буфер делает отладку очень сложной!

В моей локальной установке (MacOS 10.6 с Redis 2.2.14) полученные данные печатаются в виде строки, просто отлично.Я хотел бы найти решение, которое продолжает работать в обеих системах.

ОБНОВЛЕНИЕ: Оно также отлично работает без кодировки, указанной в CentOS 5.7.Это что-то особенное для Ubuntu?Есть ли общесистемное исправление?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2011

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

Чистый Javascript дружествен к Юникоду, но не подходит для двоичных данных.При работе с потоками TCP или файловой системой необходимо обрабатывать потоки октетов.В Node есть несколько стратегий для манипулирования, создания и потребления потоков октетов.

Необработанные данные хранятся в экземплярах класса Buffer.Буфер похож на массив целых чисел, но соответствует необработанному выделению памяти вне кучи V8.Размер буфера не может быть изменен.

Объект Buffer является глобальным.

Преобразование между буферами и строковыми объектами JavaScript требует явного метода кодирования.

Поскольку выкодировка не указана, по умолчанию она отображается как необработанные данные.Вы можете использовать buffer.toString для создания стандартной строки JS.

0 голосов
/ 30 ноября 2011

Поскольку вы не указали кодировку, она не знает, какую кодировку использовать при ее распечатке.Используйте функцию toString с кодировкой в ​​качестве параметра для правильного ведения журнала.

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