2013-11-02 21 views
6

以下代碼將整個數組保存爲redis列表中的單個值。但我想單獨保存數組值。我該怎麼做?如何將javascript數組保存爲redis列表

P.S對不起英文不好。

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

var arr = [1,2,3]; 

client.rpush('testlist',arr); 
+1

你想通過數組元素迭代並單獨插入。你可以寫一個簡單的for循環或使用Array.prototype.forEach。 – fardjad

回答

14

使用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的。

+0

使用不適合我的redis-node,稍作修改:https://gist.github.com/vainrobot/141b2162e1200f7c7855 – fullstacklife

+0

如何恢復它?正常get不起作用。 – jeevs

+0

@jeevs'lrange testlist 0 -1' https://redis.io/commands/lrange – MyMomSaysIamSpecial

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); 
})); 

優點: - 單指令會transmited到Redis的

缺點: - 一個極端情況:.apply將拋出一個RangeError: Maximum call stack size exceeded如果傳遞給RPUSH參數列表長度過大(有點OVE v8的100 000個項目)。

從MDC:

The consequences of applying a function with too many arguments (think more than tens of thousands of arguments) vary across engines (JavaScriptCore has hard-coded argument limit of 65536), because the limit (indeed even the nature of any excessively-large-stack behavior) is unspecified. Some engines will throw an exception. More perniciously, others will arbitrarily limit the number of arguments actually passed to the applied function.

+0

不適合我。 '錯誤:'rpush'命令的參數ERR錯誤。 – user2522545

+0

我再次測試它,它的工作原理,你使用了什麼代碼? – FGRibreau

+0

與您輸入的完全一致。我的節點js文件中沒有其他代碼。 – user2522545