13

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

PS 很抱歉英语不好。

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

var arr = [1,2,3];

client.rpush('testlist',arr);
4

2 回答 2

22

用于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。

于 2013-11-02T19:10:15.057 回答
9

即使@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 的项目超过 100 000 个),.apply将抛出 a 。RangeError: Maximum call stack size exceeded

来自 MDC:

应用带有太多参数的函数(考虑超过数万个参数)的后果因引擎而异(JavaScriptCore 的硬编码参数限制为 65536),因为限制(实际上甚至是任何过大堆栈的性质行为)未指定。有些引擎会抛出异常。更有害的是,其他人会任意限制实际传递给应用函数的参数数量。

于 2013-11-02T22:47:43.700 回答