2013-09-22 9 views
5

Recentemente ho passato da memcached a redis in nodejs. La cosa che mi è piaciuta in node-memcached è che posso salvare l'intero oggetto javascript nella memoria. Purtroppo non ho potuto farlo in redis. Per esempio, ho ottenuto il seguente oggetto:Memorizzazione di oggetti javascript nidificati in 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 
     } 
    } 
} 

con la 3rd-Eden/node-memcached ho potuto solo fare:

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

e poi

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

E io ottenere l'oggetto che ho salvato, proprio così com'è.

Il problema è che se Redis risparmio l'oggetto come questo:

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

Quando ottengo il valore con

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

L'uscita è solo stringa contenente [object Object].

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

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

ma non sono sicuro se questo sarà un bene, perché ci saranno folle alta I/O e non sono sicuro se il JSON obj-> stringa essere 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?

+0

ritengo ** ** memcached memorizza dati come stringa. ** node-memcached ** fa (de) processo di serializzazione automaticamente. – fardjad

+0

@fardjad Sì, hai ragione, ma Redis ha un simile processo di build-in o devo convertirlo manualmente? – Deepsy

risposta

10

Prima di tutto supporta solo i seguenti data types:

  1. String
  2. Lista
  3. Impostare
  4. Hash
  5. Ordinati impostare

Avrai bisogno di memorizzare oggetti come stringa in entrambi i numeri redis e .

node-memcached analizza/stringa automaticamente i dati. Ma lo node-redis no.

Tuttavia, è possibile implementare le proprie funzioni di serializzazione/deserializzazione per la propria app.

Il modo nodo-memcached stringifies un oggetto è 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); 
} 

Si analizza inoltre il testo recuperato 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; 
} 
Problemi correlati