【问题标题】:Storing nested javascript objects in redis - NodeJS在redis中存储嵌套的javascript对象-NodeJS
【发布时间】:2013-09-22 09:04:25
【问题描述】:

我最近在 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->string 是否会成为瓶颈(10k+ 请求/秒)。

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

【问题讨论】:

  • 我认为 memcached 将数据存储为字符串。 node-memcached 自动执行(反)序列化过程。
  • @fardjad 是的,你说得对,但是Redis有这样的内置过程还是我需要手动转换?

标签: javascript node.js object redis memcached


【解决方案1】:

首先只支持以下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;
}

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2016-01-11
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多