在redis中存储嵌套的JavaScript对象 – NodeJS

我最近从nodejs中的memcached切换到redis。 在node-memcached中我喜欢的是我可以将整个JavaScript对象保存在内存中。 可悲的是我不能在redis中这样做。 例如,我得到以下对象:

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]string。

是的,我明白redis是基于文本的协议,它试图做obj.toString(),但似乎memcached照顾对象和redis不。 我以为我可以这样做:

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

但我不确定这是否会好,因为会有疯狂的高I / O,我不确定是否JSON obj->string将是瓶颈(10K +请求/秒)。

Memcached和Redis都将数据存储为string,但是redis是否具有用于转换对象的内置function?

首先redis只支持以下数据types :

  1. 名单
  2. 哈希
  3. sorting集

您需要将对象作为string存储在redis和memcached中 。

node-memcached自动parsing/串化数据。 但是node-redis不。

但是,您可以为您的应用程序实现自己的序列化/反序列化function。

node-memcached将对象串联起来的方式如下所示 :

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

它也以这种方式分析检索到的文本:

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