2013-09-22 5 views
5

Je suis récemment passé de memcached à redis dans nodejs. Ce que j'ai aimé dans node-memcached, c'est que je peux sauvegarder tout l'objet javascript dans la mémoire. Malheureusement, je ne pouvais pas le faire en redis. Par exemple, je suis l'objet suivant:Stockage des objets javascript imbriqués dans 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 
     } 
    } 
} 

avec le 3rd-Eden/node-memcached je pouvais faire:

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

puis

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

Et je vais faire l'objet que je sauvé, juste la façon dont il est.

Le problème avec Redis est que si je sauve l'objet comme ceci:

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

Quand je reçois la valeur avec

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

La sortie est juste chaîne contenant [object Object]. Oui, je comprends Redis est un protocole basé sur le texte et il essaie de faire obj.toString(), mais semble memcached prendre soin des objets et redis pas. Je pensais que je pouvais faire:

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

mais je ne sais pas si ce sera bon, car il y aura fou élevé d'E/S et je ne suis pas sûr si la chaîne obj-> JSON va être goulot d'étranglement (10k + demande/seconde).

Memcached et Redis stockent les données sous forme de chaîne, mais redis possède-t-il une fonctionnalité intégrée pour la conversion des objets?

+0

Je pense ** memcached stocke les données ** comme chaîne. ** node-memcached ** effectue le processus de sérialisation (de) automatiquement. – fardjad

+0

@fardjad Oui, vous avez raison, mais est-ce que Redis a un tel processus intégré ou dois-je le convertir manuellement? – Deepsy

Répondre

10

D'abord ne supporte que les éléments suivants data types:

  1. Chaîne
  2. Liste
  3. Set
  4. Hash
  5. Classé mis

Vous devez stocker objets comme chaîne dans les deux redis et .

node-memcached analyse/simplifie automatiquement les données. Mais node-redis ne fait pas. Toutefois, vous pouvez implémenter vos propres fonctions de sérialisation/désérialisation pour votre application.

La manière nœud-memcachedstringifies un objet est 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); 
} 

Il analyse également le texte récupéré 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; 
} 
Questions connexes