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

use*_*545 8 javascript redis node.js node-redis

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

PS很抱歉英语不好.

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

var arr = [1,2,3];

client.rpush('testlist',arr);
Run Code Online (Sandbox Code Playgroud)

gim*_*ete 17

用于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) {

})
Run Code Online (Sandbox Code Playgroud)

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


FGR*_*eau 7

即使@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);
}));
Run Code Online (Sandbox Code Playgroud)

优点: - 一条指令将被传送到Redis

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

来自MDC:

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