2013-09-22 15 views
5

Niedawno zmieniłem z memcached na redis w nodejs. W memcached node podobało mi się to, że mogę zapisać cały obiekt javascript w pamięci. Niestety nie mogłem tego zrobić w trybie redis. Na przykład, mam następujący obiekt:Przechowywanie zagnieżdżonych obiektów javascript na czerwono - 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 
     } 
    } 
} 

z 3rd-Eden/node-memcached może po prostu zrobić:

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

a następnie

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

A ja mam uzyskać obiekt zapisany, Po prostu tak jest.

Problem z REDiS jest, że jeśli obiekt zapisać tak:

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

Kiedy uzyskać wartość z

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

Wyjście jest tylko ciąg zawierający [object Object].

Tak, rozumiem, że redis jest protokołem tekstowym i próbuje zrobić obj.toString(), ale wydaje się, że memcached zajmuje się obiektami, a redis nie. Myślałem, że mogę po prostu zrobić:

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

ale nie jestem pewien, czy to będzie dobre, ponieważ nie będzie szalony wysokiej I/O, a ja nie jestem pewien, czy JSON obj-> STRING być wąskim gardłem (10k + żądanie/sekundę).

Zarówno Memcached, jak i Redis przechowują dane jako ciągi znaków, ale czy redis ma wbudowaną funkcję konwersji obiektów?

+0

myślę ** Memcached danych ** Stores as string. ** node-memcached ** automatycznie (szereguje) proces serializacji. – fardjad

+0

@fardjad Tak, masz rację, ale czy Redis ma taki proces kompilacji lub muszę go przekonwertować ręcznie? – Deepsy

Odpowiedz

10

Przede wszystkim obsługuje tylko następujące data types:

  1. String
  2. Lista
  3. Ustaw
  4. Hash
  5. Sort ustawiony

Musisz przechowywać obiekty jako ciąg w zarówno redis i .

node-memcached przetwarza/automatycznie porządkuje dane. Ale nie ma tego node-redis.

Możesz jednak wdrożyć własne funkcje serializacji/deserializacji dla swojej aplikacji.

Sposób węzła-memcached stringifies obiekt jest 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); 
} 

Analizuje również pobierane tekst 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; 
} 
Powiązane problemy