2014-01-28 11 views

Antwort

10

Ja, ich muss zustimmen, dass es dafür keine Beispiele gibt, aber ich habe es geschafft, den Stream zu erstellen, auf dem ich mehrere Einfügebefehle im Stapel gesendet habe.

Sie sollten Modul für redis Strom installieren:

npm install redis-stream 

Und das ist, wie Sie den Stream verwenden:

var redis = require('redis-stream'), 
    client = new redis(6379, '127.0.0.1'); 

// Open stream 
var stream = client.stream(); 

// Example of setting 10000 records 
for(var record = 0; record < 10000; record++) { 

    // Command is an array of arguments: 
    var command = ['set', 'key' + record, 'value']; 

    // Send command to stream, but parse it before 
    stream.redis.write(redis.parse(command)); 
} 

// Create event when stream is closed 
stream.on('close', function() { 
    console.log('Completed!'); 

    // Here you can create stream for reading results or similar 
}); 

// Close the stream after batch insert 
stream.end(); 

Sie können aber auch als viele Streams erstellen, wie Sie wollen und offen/schließe sie zu jeder Zeit wie du willst.

Es gibt mehrere Beispiele der Verwendung redis streamen in node.js auf redis-stream node module

+0

Danke Toni! Weißt du, ob und wie es mit Lua-Skripten funktioniert? –

+1

Hmm Ich habe es noch nicht versucht, aber ich denke, Sie könnten die Skripte in redis-Instanzen laden und sie mit 'eval' oder' evalsha' Befehlen ausführen, die über die Pipeline gesendet werden. – Toni

+0

Ich habe Ihren Code wörtlich ausgeführt und keiner der Schlüssel wurde gesetzt. Der Aufruf von "keys *" über redis-cli liefert danach eine leere Menge. – Jake

2

Sie könnten batch() aussehen wollen auch. Der Grund, warum es langsamer mit multi() wäre, ist, weil es transaktional ist. Wenn etwas fehlschlägt, wird nichts ausgeführt. Das mag das sein, was du willst, aber du hast hier die Wahl für Geschwindigkeit.

Das Redistream-Paket scheint die Masseneinfügefunktion von Redis nicht zu nutzen, daher ist es auch langsamer als die Masseninsertion, über die die Redis-Site mit redis-cli spricht.

Eine weitere Idee wäre redis-cli zu verwenden und ihnen eine Datei aus zu streamen geben, die das NPM-Paket tut: https://github.com/almeida/redis-mass

nicht scharf auf ersten auf der Festplatte eine Datei zu schreiben? Dieses Repo: https://github.com/eugeneiiim/node-redis-pipe/blob/master/example.js

... auch Streams zu Redis, aber ohne in Datei zu schreiben. Es streamt zu einem erzeugten Prozess und löscht den Puffer von Zeit zu Zeit.

Auf Redis Website unter Masseneinfügung (http://redis.io/topics/mass-insert) können Sie ein kleines Ruby-Beispiel sehen. Der oben genannte Repo hat das im Grunde nach Node.js portiert und dann direkt an den Prozess, der erzeugt wurde, gestreamt.

So in Node.js, haben wir:

var redisPipe = spawn('redis-cli', ['--pipe']);

spawn() gibt einen Verweis auf ein Kind-Prozess, dass man Rohr mit stdin. Zum Beispiel: redisPipe.stdin.write().

Sie können einfach weiter in einen Puffer schreiben, diesen an den untergeordneten Prozess streamen und dann so oft löschen.Dies wird dann nicht füllen und wird daher ein wenig besser im Speicher sein als vielleicht das node_redis Paket (das wörtlich in seinen Dokumenten sagt, dass Daten im Speicher gehalten werden), obwohl ich nicht so tief hineingeschaut habe, damit ich nicht ' Ich weiß, was der Speicher-Fußabdruck ist. Es könnte das Gleiche tun.

Bedenken Sie natürlich, wenn etwas schief geht, scheitert alles. Dafür wurden Tools wie fluentd entwickelt (und das ist noch eine weitere Option: http://www.fluentd.org/plugins/all - es hat mehrere Redis-Plugins) ... Aber auch das bedeutet, dass Sie Daten auf der Festplatte irgendwo bis zu einem gewissen Grad sichern. Ich habe Embugk auch persönlich dafür verwendet (was eine Datei auf der Festplatte benötigt), aber es hat keine Masseneinfügungen unterstützt, also war es langsam. Es dauerte fast 2 Stunden für 30.000 Datensätze.

Ein Vorteil für einen Streaming-Ansatz (nicht von der Festplatte gesichert) ist, wenn Sie eine große Einfügung aus einer anderen Datenquelle machen. Wenn Sie davon ausgehen, dass die Datenquelle viele Daten zurückgibt und Ihr Server nicht über genügend Festplattenspeicher verfügt, um alle Daten zu unterstützen, können Sie sie stattdessen streamen. Auch hier riskieren Sie Fehler.

Ich bin in dieser Position, da ich ein Docker-Image erstelle, das auf einem Server mit nicht genügend Speicherplatz für große Datensätze ausgeführt wird. Natürlich ist es viel einfacher, wenn Sie alles auf die Festplatte des Servers passen ... Aber wenn Sie nicht können, ist das Streaming zu redis-cli Ihre einzige Option.

Wenn Sie wirklich eine Menge Daten regelmäßig pushen, würde ich wahrscheinlich flentd empfehlen, um ehrlich zu sein. Es enthält viele großartige Funktionen, mit denen Sie sicherstellen können, dass Ihre Daten dorthin gelangen, wo sie hingehören. Wenn etwas nicht funktioniert, kann es fortgesetzt werden.

Ein Problem mit all diesen Node.js-Ansätzen ist, dass wenn etwas fehlschlägt, entweder alles verloren geht oder alles neu eingefügt werden muss.