2013-09-22 15 views
5

Geçtiğimiz günlerde nodejs'de memcached'ten redis'e geçtim. Düğüm-memcached'de sevdiğim şey, tüm javascript nesnesini belleğe kaydedebildiğimdi. Ne yazık ki bunu redis'te yapamadım. Örneğin, ben aşağıdaki nesneyi var: 3rd-Eden/node-memcached ileYuvalanmış javascript nesnelerini redis'te saklama - 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 
     } 
    } 
} 

Sadece yapabileceği:

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

ve sonra

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

Ve ben kurtardı nesneyi elde edersiniz, olduğu gibi.

REDIS ile sorun olduğunu böyle nesneyi kaydederseniz:

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

ben çıkış sadece dize [object Object] içeren bir

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

ile değer elde

.

Evet, redis’in metin tabanlı bir protokol olduğunu ve obj.toString() işlevini denediğini anlıyorum, ancak memcached nesnelerin dikkatini çekiyor ve redis yapmadı. ben sadece yapabileceğini düşündüm:

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

ama orada deli yüksek I/O olacak ve emin değilim çünkü bu, iyi olacak olmadığından emin değilim JSON obj-> dize olacak eğer darboğaz olun (10k + istek/saniye).

Hem Memcached hem de Redis, verileri dize olarak saklar, ancak redis, nesneleri dönüştürmek için yerleşik özelliklere sahiptir? Tüm ait

+0

Ben dize olarak ** memcached ** saklar verileri düşünüyorum:

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

Ayrıca alınan metni this way ayrıştırır. ** node-memcached ** (de) serileştirme işlemini otomatik olarak yapar. – fardjad

+0

@fardjad Evet, haklısın, ama Redis'in böyle bir yerleşik süreci var mı yoksa el ile mi dönüştürmem gerekiyor? – Deepsy

cevap

10

İlk yalnızca data types aşağıdaki destekler: set

  • Hash
  • SÄ Set

    1. Dize
    2. listesi

    depolamak gerekir dize olarak nesneleri her ikisi de redis ve . Verileri otomatik olarak ayrıştırır/dizer.

    node-memcached Ancak node-redis yapmıyor. Bununla birlikte, uygulamanız için kendi seri hale getirme/seriyi kaldırma işlevlerinizi uygulayabilirsiniz.

    yolu bir nesne as follows olduğunu düğüm-memcached stringifies:

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