在redis中存储嵌套的javascript对象 - NodeJS

时间:2013-09-22 09:04:26

标签: javascript node.js object redis memcached

我最近在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]的字符串。

是的,我理解redis是基于文本的协议,并且它正在尝试执行obj.toString(),但似乎memcached处理对象而redis没有。 我以为我可以做到:

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

但我不确定这是不是很好,因为会有疯狂的高I / O而且我不确定JSON obj->字符串是否会成为瓶颈(10k +请求/秒)。

Memcached和Redis都将数据存储为字符串,但redis是否具有转换对象的内置功能?

1 个答案:

答案 0 :(得分:13)

首先仅支持以下data types

  1. 字符串
  2. 列表
  3. 哈希
  4. 排序集
  5. 您需要在 redis 中将对象存储为字符串。

    node-memcached自动解析/字符串化数据。但node-redis没有。

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

    node-memcached 对对象进行字符串化的方式为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;
    }