2013-09-22 82 views
5

我最近從nodejs中的memcached切換到redis。我在node-memcached中喜歡的是我可以將整個JavaScript對象保存在內存中。可悲的是我不能在redis中這樣做。例如,我得到了以下對象:在redis中存儲嵌套javascript對象 - 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 
     } 
    } 
} 

3rd-Eden/node-memcached我可能只是這樣做:

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

然後

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

我會得到我保存的對象,只是它的方式。

與Redis的問題是,如果我保存這樣的對象:

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

當我得到

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

輸出包含[object Object]只是字符串的值。

是的,我明白redis是基於文本的協議,它試圖做obj.toString(),但似乎memcached照顧的對象和redis不。 我想我可能只是做:

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

,但我不知道這是否會是不錯的,因爲會有瘋狂的高I/O,我不知道,如果JSON obj->字符串成爲瓶頸(10k +請求/秒)。

Memcached和Redis都將數據存儲爲字符串,但redis是否具有用於轉換對象的內置功能?

+0

我覺得** ** memcached的存儲數據的字符串。 ** node-memcached **自動執行(de)序列化過程。 – fardjad

+0

@fardjad是的,你是對的,但Redis有這樣的內置過程,或者我需要手動轉換它? – Deepsy

回答

10

所有首先僅支持以下data types

  1. 字符串
  2. 列表
  3. 設置
  4. 哈希
  5. 有序集合

你需要存儲對象作爲字符串輸入redis

node-memcached自動解析/串化數據。但是node-redis沒有。

但是,您可以爲您的應用程序實現自己的序列化/反序列化函數。

方式節點的memcached stringifies對象是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); 
} 

它還解析檢索到的文本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; 
}