在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 :
- 串
- 名单
- 组
- 哈希
- 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; }