Memorizzazione di oggetti javascript nidificati in redis – NodeJS

Di recente sono passato da memcached a redis in nodejs. La cosa che mi è piaciuta in node-memcached è che posso salvare l’intero object javascript nella memoria. Purtroppo non ho potuto farlo in redis. Ad esempio, ho ottenuto il seguente object:

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

con il 3 ° Eden / node-memcached ho potuto fare solo:

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

e poi

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

E otterrò l’object che ho salvato, proprio così com’è.

Il problema con redis è che se salvi l’object in questo modo:

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

Quando ottengo il valore con

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

L’output è solo una stringa contenente [object Object] .

Sì, capisco che redis è un protocollo basato su testo e sta cercando di fare obj.toString (), ma sembra memcached occuparsi di oggetti e redis no. Pensavo di poter fare solo:

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

ma non sono sicuro che tutto ciò andrà bene, perché ci sarà un I / O folle e non sono sicuro che la stringa obj-> JSON sarà un collo di bottiglia (10k + richiesta / secondo).

Memcached e Redis memorizzano i dati come string, ma i redis hanno funzionalità incorporate per la conversione di oggetti?

Innanzitutto redis supporta solo i seguenti tipi di dati :

  1. Stringa
  2. Elenco
  3. Impostato
  4. hash
  5. Set ordinato

Dovrai memorizzare gli oggetti come stringa sia in redis che memcached .

parsoc -memcached analizza / stringifica automaticamente i dati. Ma il nodo-redis no.

Tuttavia, puoi implementare le tue funzioni di serializzazione / deserializzazione per la tua app.

Il modo in cui il nodo-memcached stringifica un object è il seguente :

 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); } 

Analizza anche il testo recuperato in questo modo :

 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; }