Redis ruft den gesamten Wert der Liste ohne Iteration und ohne Poppen ab

73

Ich habe einen einfachen Redis-Listenschlüssel => "vendor_id"

Jetzt möchte ich nur noch den gesamten Wert der Liste abrufen, ohne den Wert tatsächlich zu wiederholen oder aus der Liste zu entfernen

Beispiel zum Abrufen des gesamten Werts aus einer Liste Jetzt habe ich über die Redis-Länge iteriert

element = []
0.upto(redis.llen("supplier_id")-1) do |index| 
  element << redis.lindex("supplier_id",index)
 end

Kann dies ohne die Iteration mit besserer Redis-Modellierung erfolgen ? kann jemand vorschlagen

Viren
quelle
Können Sie beschreiben, was Sie mit der Redis-Liste machen möchten? Vielleicht sollten Sie einen anderen Schlüsseltyp verwenden.
Eyossi
@eyossi Die Idee ist, ein Auswahl-Tag mit dem Optionswert für die von lieferanten_id präsentierten Datenbanken zu erstellen, da das Abrufen von Datensätzen in relationalen Datenbanken teuer war Datenbank
Viren
Es gibt eine offizielle Redis-Dokumentation zu Listen, die dies ausführlicher erklärt. Mehr unter redis.io/topics/data-types-intro#redis-lists
raksheetbhat

Antworten:

170

Um alle Elemente einer Liste mit Redis abzurufen, müssen Sie nicht jedes einzelne Element iterieren und abrufen. Es wäre wirklich ineffizient.

Sie müssen nur den Befehl LRANGE verwenden , um alle Elemente auf einmal abzurufen.

elements = redis.lrange( "supplier_id", 0, -1 )

gibt alle Elemente der Liste zurück, ohne die Liste selbst zu ändern.

Didier Spezia
quelle
2
Wenn mit speichereffizient gemeint ist, dass die Elemente schrittweise iteriert werden, kann dies mithilfe von llen und Schleifen bei lrange-Aufrufen implementiert werden, erhöht jedoch die Anzahl der Roundtrips und Sie verlieren an Konsistenz.
Didier Spezia
Jedes Mal, wenn ich dies versuche, erhalte ich den Fehler "Ungültige Argumente"
Ricardo
@DidierSpezia Dies kehrt in umgekehrter Reihenfolge meiner Hinzufügung zu redis zurück. Gibt es eine Möglichkeit, die Ausgabe in der Reihenfolge des Einfügens zu erhalten?
Benutzer1692342
2
Wenn Sie mit RPUSH anstelle von LPUSH einfügen, erfolgt dies in derselben Reihenfolge.
Didier Spezia
2

Ihre Frage ist mir etwas unklar, aber wenn die lieferanten_id numerisch ist, warum nicht eine verwenden ZSET?

Fügen Sie Ihre Werte wie folgt hinzu:

ZADD suppliers 1 "data for supplier 1"  
ZADD suppliers 2 "data for supplier 2"  
ZADD suppliers 3 "data for supplier 3"  

Sie können dann alles bis zu (aber ohne Lieferanten drei) wie folgt entfernen:

ZREMRANGEBYSCORE suppliers -inf 2

oder

ZREMRANGEBYSCORE suppliers -inf (3

Das gibt Ihnen auch einen sehr schnellen Zugriff (nach Lieferanten-ID), wenn Sie nur daraus lesen möchten.

Hoffentlich hilft das!

mkgrunder
quelle
Können Sie die Dokumentation dafür bereitstellen, dass es sicherlich helfen kann
Viren