Dee*_*psy 7 javascript memcached object redis node.js
我最近在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
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用3rd-Eden/node-memcached,我可以这样做:
memcached.set("obj", obj, 12345, function(err) { });
Run Code Online (Sandbox Code Playgroud)
然后
memcached.get("obj", function(err, data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
而且我会得到我保存的对象,就像它一样.
redis的问题是,如果我像这样保存对象:
redisclient.set("obj", obj, redis.print);
Run Code Online (Sandbox Code Playgroud)
当我得到价值时
redisclient.get("obj", function(err, data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
输出只是包含的字符串[object Object].
是的我明白redis是基于文本的协议,它正在尝试做obj.toString(),但似乎memcached负责对象而redis没有.我以为我可以做到:
redisClient.set("obj", JSON.stringify(obj));
Run Code Online (Sandbox Code Playgroud)
但我不确定这是不是很好,因为会有疯狂的高I/O而且我不确定JSON obj->字符串是否会成为瓶颈(10k +请求/秒).
Memcached和Redis都将数据存储为字符串,但redis是否具有转换对象的内置功能?
far*_*jad 13
您需要在redis和memcached中将对象存储为字符串.
node-memcached自动解析/字符串化数据.但是 node-redis没有.
但是,您可以为您的应用程序实现自己的序列化/反序列化功能.
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);
}
Run Code Online (Sandbox Code Playgroud)
它还以这种方式解析检索到的文本:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5724 次 |
| 最近记录: |