2017-05-15 4 views
0

Ich habe eine Liste, und ich möchte es in Redis Cache. Ich habe zwei Möglichkeiten ausprobiert, um Hashes zu erreichen.Store-Listen auf Redis

Betrachten Sie diesen ersten Ansatz. Ich schaffe nur einen Hash und stellen Elemente als Hash-Werte:

// .. 

$apiArray = [..]; // array from parsing an api 

if(!$c->keys('lista')){ 
    foreach (json_decode($apiArray) as $item){ 
     $c->hset('lista', $item->id, serialize($item)); 
    } 
} 

foreach ($c->hgetall('lista') as $key){ 

    $item = unserialize($key); 

    echo '<p>'; 
    echo '<strong>id</strong>: '.$item->id.'<br>'; 
    echo '<strong>name</strong>: '.$item->name.'<br>'; 
    echo '<strong>email</strong>: '.$item->email.'<br>'; 
    echo '</p>'; 
} 

Schleife über 10000 Artikel, dauert es 0,5 Sekunden .

Und jetzt betrachten Sie dieses. Ein einzelner Hash auf jedem Element des ursprünglichen Arrays:

if(!$c->keys('lista:*')){ 
    foreach (json_decode($apiArray) as $item){ 
     $c->hset('lista:'.$item->id, 'element', serialize($item)); 
    } 
} 

foreach ($c->keys('lista:*') as $item) { 
    $item = unserialize($c->hget($item, 'element')); 

    echo '<p>'; 
    echo '<strong>id</strong>: '.$item->id.'<br>'; 
    echo '<strong>name</strong>: '.$item->name.'<br>'; 
    echo '<strong>email</strong>: '.$item->email.'<br>'; 
    echo '</p>'; 
} 

Die Schleife von 10000 Datensätze nimmt 3 Sekunden.

Dies ist sehr überraschend für mich, weil der zweite ist der Ansatz in Redis offiziellen Dokumentation abgedeckt, und es unterstützt auch die sekundäre Indizierung (mit Zadd und Sadd).

Warum ist langsamster als der erste Ansatz? Habe ich etwas falsch gemacht?

Ich denke, dass es passieren kann, weil ich 10000 mal die hgetall() Methode aufrufen muss, um Elemente in der Schleife zu erhalten. Können Sie das bestätigen?

Muss ich den ersten Ansatz bevorzugen?

Danke Jungs

M :)

Antwort

2

Der Grund der zweite Block von Code langsamer ist, dass es einen hget Aufruf für jede Iteration der Schleife macht. Daher führt jede Iteration zu einem Netzwerk-Roundtrip zu Ihrem Redis-Server.

Im Gegensatz dazu führt der erste Codeblock innerhalb des Schleifenblocks keine Netzwerkaufrufe durch. Es läuft also viel schneller.

+0

danke, das macht Sinn für mich. Aber jetzt ist die Frage: Gibt es einen Spaziergang, um zu vermeiden, hget (oder Scan) in der Schleife zu nennen? – Mauro

+1

Können Sie die Daten restrukturieren, so dass statt eines Hash für jedes Element des Arrays nur ein String-Wert verwendet wird? Dann könnten Sie mit einem mget mehrere Objekte abrufen und einige Rundreisen speichern. –

+0

Oder verwenden Sie Pipelining –

1

Es scheint, dass Sie daran interessiert sind, Ihre gesamte Liste zwischenzuspeichern, sie jedes Mal in großen Mengen zu schreiben und abzurufen. In diesem Fall können Sie das gesamte Ding einfach als JSON in einer Redis-Zeichenfolge speichern, um maximale Leistung zu erzielen.