2013-09-22 3 views
5

Недавно я переключился с memcached на redis в nodejs. То, что мне понравилось в node-memcached, было то, что я могу сохранить весь объект javascript в памяти. К сожалению, я не мог сделать это в redis. Например, я получил следующий объект:Хранение вложенных объектов javascript в redis - NodeJS

var obj = { 
    name: "Hello world!", 
    author: "admin", 
    user: { 
     "yolololo" : { 
      "id": "352asdsafaseww", 
      "server": 5, 
      "data" : { 
        x: 1, 
        y: 1, 
        z: 50 
      } 
     }, 
     "yolol" : { 
      "id": "358dsa", 
      "server": 7 
     } 
    } 
} 

с 3rd-Eden/node-memcached я мог бы просто сделать:

memcached.set("obj", obj, 12345, function(err) { }); 

, а затем

memcached.get("obj", function(err, data) { 
    console.log(data); 
}); 

И я получить объект я сохранил, так оно и есть.

Проблема с Redis в том, что если я сохранить объект как это:

redisclient.set("obj", obj, redis.print); 

Когда я получаю значение с

redisclient.get("obj", function(err, data) { 
    console.log(data); 
}); 

Выход только строки, содержащей [object Object].

Да, я понимаю, что redis - это текстовый протокол, и он пытается выполнить obj.toString(), но, похоже, memcached заботится о объектах, а redis - нет. я думал, что я мог бы просто сделать:

redisClient.set("obj", JSON.stringify(obj)); 

, но я не уверен, если это будет хорошо, потому что там будет с ума высокой I/O, и я не уверен, что если obj-> строка JSON будет быть узким местом (10k + запрос/секунда).

Как Memcached, так и Redis хранят данные как строку, но имеет ли redis встроенную функцию для преобразования объектов?

+0

Я думаю ** ** Memcached хранит данные в виде строки. ** node-memcached ** автоматически выполняет сериализацию (de). – fardjad

+0

@fardjad Да, вы правы, но у Redis такой встроенный процесс, или мне нужно его вручную преобразовать? – Deepsy

ответ

10

Прежде всего поддерживает только следующие data types:

  1. Строка
  2. Список
  3. Set
  4. Hash
  5. отсортированного набора

Вам нужно хранить объекты как строку в обе redis и .

node-memcached автоматически анализирует данные. Но node-redis нет.

Однако вы можете реализовать свои собственные функции сериализации/десериализации для вашего приложения.

Путь узел-Memcached stringifies объект является as follows:

if (Buffer.isBuffer(value)) { 
    flag = FLAG_BINARY; 
    value = value.toString('binary'); 
} else if (valuetype === 'number') { 
    flag = FLAG_NUMERIC; 
    value = value.toString(); 
} else if (valuetype !== 'string') { 
    flag = FLAG_JSON; 
    value = JSON.stringify(value); 
} 

Он также анализирует найденный текст this way:

switch (flag) { 
    case FLAG_JSON: 
     dataSet = JSON.parse(dataSet); 
     break; 
    case FLAG_NUMERIC: 
     dataSet = +dataSet; 
     break; 
    case FLAG_BINARY: 
     tmp = new Buffer(dataSet.length); 
     tmp.write(dataSet, 0, 'binary'); 
     dataSet = tmp; 
     break; 
} 
Смежные вопросы