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 :)
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
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. –
Oder verwenden Sie Pipelining –