我最近在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]。
[object Object]
是的,我知道redis是基于文本的协议,并且正在尝试执行obj.toString(),但是memcached似乎可以处理对象,而redis则不需要。我以为我可以做到:
redisClient.set("obj", JSON.stringify(obj));
但是我不确定这是否会很好,因为会有疯狂的高I / O,而且我不确定JSON obj-> string是否会成为瓶颈(10k + request / second)。
Memcached和Redis都将数据存储为字符串,但是redis是否具有用于转换对象的内置功能?
首先,redis仅支持以下数据类型:
您需要将对象以字符串形式存储在 redis 和memcached中。
node-memcached 自动解析/字符串化数据。但是 node-redis 没有。
但是,您可以为应用程序实现自己的序列化/反序列化功能。
顺便 节点的memcached stringifies一个目的是如下:
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; }