2013-11-02 10 views
6

Der folgende Code speichert das gesamte Array als Einzelwert in der Liste redis. Aber ich möchte Array-Werte einzeln speichern. Wie kann ich es tun?So speichern Sie JavaScript-Array als Redis-Liste

P.S Sorry für schlecht Englisch.

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

var arr = [1,2,3]; 

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

Sie wollen durch die Array-Elemente zu durchlaufen und sie einzeln einlegen. Sie können eine einfache 'for'-Schleife schreiben oder' Array.prototype.forEach' verwenden. – fardjad

Antwort

14

Verwenden multi() Pipeline, um mehrere Befehle:

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

}) 

Und exec() schließlich rufen die Befehle zu senden, um Redis.

+0

Verwenden von redis-node, die für mich nicht funktionierte, leicht modifiziert hier: https://gist.github.com/vainrobot/141b2162e1200f7c7855 – fullstacklife

+0

wie man es zurückholen ?? normales get funktioniert nicht. – jeevs

+0

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

6

Auch wenn @gimenete Antwort funktioniert, ist die beste Art und Weise zu tun, was Sie wollen die Listenelemente zu übermitteln ist als Argumente wie so 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); 
})); 

Pros: - ein einzelner Befehl wird transmited

Cons Redis: - eine Ecke Fall: .apply eine RangeError: Maximum call stack size exceeded werfen, wenn die Argumente Listenlänge übergeben zu groß ist, um zu rpush (ein wenig ove r 100 000 Artikel für v8).

Von 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

Nicht für mich arbeiten. 'Fehler: ERR falsche Anzahl von Argumenten für 'rpush' Befehl. – user2522545

+0

Ich habe es nochmal getestet und es funktioniert, welchen Code hast du benutzt? – FGRibreau

+0

Genau wie Sie tippen. Es gibt keinen anderen Code in meiner Knoten-JS-Datei. – user2522545