如何将javascript数组保存为redis列表

时间:2013-11-02 18:21:35

标签: javascript node.js redis node-redis

以下代码将整个数组保存为redis列表中的单个值。但我想单独保存数组值。我该怎么做?

P.S很抱歉英语不好。

var redis = require('redis'),
    client = redis.createClient();

var arr = [1,2,3];

client.rpush('testlist',arr);

2 个答案:

答案 0 :(得分:16)

使用multi()一次管道多个命令:

var redis = require('redis'),
    client = redis.createClient();

var arr = [1,2,3];

var multi = client.multi()

for (var i=0; i<arr.length; i++) {
    multi.rpush('testlist', arr[i]);
}

multi.exec(function(errors, results) {

})

最后调用exec()将命令发送到redis。

答案 1 :(得分:6)

即使@gimenete回答有效,最好的方法就是将列表元素作为参数转发给rpush,如下所示:

var redis = require('redis'),
    client = redis.createClient();

var arr = [1,2,3];
client.rpush.apply(client, ['testlist'].concat(arr));

// ... or with a callback
client.rpush.apply(client, ['testlist'].concat(arr).concat(function(err, ok){
  console.log(err, ok);
}));

<强>赞成: - 一条指令将被传送到Redis

<强>缺点: - 如果传递给rpush的参数列表长度太大(v8略多于10万个项目),.apply将抛出RangeError: Maximum call stack size exceeded

来自MDC:

  

应用具有太多参数的函数的后果   (想想成千上万的论点)因引擎而异   (JavaScriptCore的硬编码参数限制为65536),因为   限制(实际上甚至是任何过大的堆栈行为的性质)   没有具体说明。有些引擎会抛出异常。更多   有害的是,其他人会随意限制论点的数量   实际上传递给了应用函数。