2016-04-01 7 views
0

Ich verwende PHPRedis dafür.Wählen Sie alle Schlüsseldaten für ein bestimmtes Muster von Redis mit PHP

brauche ich Skript zu erstellen, dass die Kopien alle Schlüssel mit dem Muster mobile* von einem Redis host1 zu host2.

Ich habe dies funktioniert, indem Sie alle Schlüssel aus host1 mit dem Muster mobile*. Wiederholen Sie dann jede dieser Schlüssel mit der Schlüsselmethode get, um die Daten zurückzugeben. Ich habe dann den Schlüssel für host2 die set Methode:

$auKeys = $redis->keys("mobile*"); 
foreach ($auKeys as $key) { 
    $data = $redis->get($key); 
    $redis2->set($key, $data, 6000); 
    echo $key; 
} 

Das Problem ist, das etwa 5 Minuten in Anspruch nimmt - ich muss es 2-3 Minuten runter. Gibt es einen anderen Weg, dies zu tun?

+0

Wie viel von dieser Zeit läuft mit KEYS? –

+0

Das Abrufen der Schlüssel erfolgt sofort - ein paar Sekunden. Das Schleifen jeder Taste dauert einige Minuten. – smj2393

Antwort

1

Die einfachste Route zu SET können Sie für eine bessere Leistung nehmen, ist PIPE die Schlüssel und drücken Sie den Redis-Server einmal, um alle von ihnen statt einer Reise/Schlüssel auszuführen.

https://github.com/phpredis/phpredis/issues/251

$pipeline = $redis->multi($host, Redis::PIPELINE); 

//put result in our shared list 
foreach ($items as $item) { 
    $pipeline->sAdd($key, $item); 
} 

$ret = $pipeline->exec(); 

Zur gleichen Zeit wird auch Bibliotheken da draußen, wenn Sie eine andere Art und Weise suchen Befehle Redis Protocol trasnlate.

redis bulk import using --pipe

+1

Danke Rabee, das scheint mein Problem gelöst zu haben! – smj2393

1

Normalerweise ist es am besten KEYS in der Produktion Code zu vermeiden. Es ist vorzuziehen, die Anwendung, die die Schlüssel schreibt, zu modifizieren, wenn möglich, eine Liste der verwendeten Schlüssel zu behalten oder die neuere SCAN-Operation zu verwenden.

In diesem Fall haben Sie herausgefunden, dass KEYS nicht lange dauerte (es wird, wenn Sie einen sehr großen Schlüsselraum haben, wird die Anzahl der Schlüssel mit der Zeit wachsen?), So ist die langsame Leistung auf alle Netzwerk-Roundtrips. Eine pro GET. Pipelines sind in der Tat eine gute Möglichkeit, Operationen zu gruppieren, um Roundtrips zu vermeiden.

In diesem Fall empfehle ich die Verwendung von MGET, um alle Werte in einem Netzwerk op und MSET zu erhalten, um sie in einem Netzwerk op zu aktualisieren.