Mehrere Werte aus der Redis-Datenstruktur atomar einfügen?
Gibt es ein Redis-Daten-Struktur, die es ermöglicht, Atomare operation des knallens (+entfernen) mehrere Elemente, die es enthält?
Gibt es bekannte SPOP oder RPOP, aber immer nur einen einzelnen Wert zurückgeben. Also, wenn ich den ersten N Werte aus der Menge/Liste, muss ich rufen Sie den Befehl N-mal, was teuer ist. Lassen Sie uns sagen, dass die Menge/Liste enthält Millionen von Artikeln. Gibt es etwas wie SPOPM "setName" 1000
die zurückkehren würde, und entfernen Sie 1000 zufällige Elemente aus einer Menge oder RPOPM "listName" 1000
was wieder die 1000 Recht-die meisten Artikel aus der Liste?
Ich weiß, gibt es Befehle wie SRANDMEMBER und LRANGE, aber das tun Sie nicht entfernen Sie die Elemente aus der Datenstruktur. Sie können einzeln gelöscht werden. Allerdings, wenn es mehr Kunden Lesen aus der gleichen Datenstruktur, einige Elemente können mehr als einmal Lesen und einige können gelöscht werden, ohne Sie zu Lesen! Daher Atomarität ist, was meine Frage ist.
Auch, ich bin in Ordnung, wenn die Zeit-Komplexität für eine solche operation ist teurer. Ich bezweifle, dass es teurer sein als die Erteilung N (sagen wir mal 1000, N aus dem vorigen Beispiel) gesonderte Anträge zu Redis server.
Weiß ich auch über separate Transaktion zu unterstützen. Aber dieser Satz von Redis docs schreckt mich von der Nutzung für parallele Prozesse ändern Sie die set (destruktives Lesen):
Bei der Verwendung von UHR, EXEC-ausführen-Befehle nur, wenn der überwachte Schlüssel nicht geändert wurden, so dass für einen check-and-set-Mechanismus.
InformationsquelleAutor der Frage Pavel S. | 2013-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ab Redis 3.2 der Befehl
SPOP
hat eine[count]
argument abrufen mehrerer Elemente aus einer Menge.Sehen http://redis.io/commands/spop#count-argument-extension
InformationsquelleAutor der Antwort Alessandro Cosentino
Verwenden
LRANGE
mitLTRIM
im pipeline. Die pipeline wird die Ausführung als eine einzige Atomare Transaktion. Ihre sorgen oben überWATCH
EXEC
wird hier nicht anwendbar sein, weil Sie dieLRANGE
undLTRIM
als eine Transaktion ohne die Möglichkeit, für jede weitere Transaktionen von anderen clients, zwischen Sie zu kommen. Probieren Sie es aus.InformationsquelleAutor der Antwort Eli
Erweitern Eli Antwort mit ein komplettes Beispiel für die Liste der Sammlungen, mit
lrange
undltrim
gelieferten anstelle von Lua:Wenn Sie wollten, um die operation atomar ist, würden Sie wickeln die lrange und ltrim in
multi
undexec
Befehle.Auch, wie an anderer Stelle erwähnt, sollten Sie wahrscheinlich
ltrim
die Anzahl der zurückgegebenen Elemente nicht die Anzahl der Elemente, die Sie gefragt haben. wenn z.B. du hastlrange a 0 99
bekam aber 50 Artikel, die Sieltrim a 50 -1
nichtltrim a 100 -1
.Umzusetzen queue-Semantik statt einem Stapel ersetzen
lpush
mitrpush
.InformationsquelleAutor der Antwort thom_nic
wenn Sie möchten, dass ein lua-Skript, das schnell und einfach.
dann müssen Sie nicht haben, um eine Schleife.
update:
Ich habe versucht, dies zu tun mit srandmember (2.6) mit dem folgenden Skript:
aber ich bekomme eine Fehlermeldung:
Ich weiß nicht, ob die zukünftige version erlauben, aber ich nehme an, nicht. Ich denke, es wäre ein problem mit der Replikation.
InformationsquelleAutor der Antwort Yehosef
Ich denke, Sie sollten sich auf der LUA-Unterstützung in Redis. Wenn Sie schreiben, ein LUA-Skript und führt es auf redis, es ist garantiert, dass Sie atomar ist (weil Redis ist mono-threaded). Keine Abfragen ausgeführt werden, bevor das Ende des LUA-Skript (ie: Sie können nicht umsetzen, eine große Aufgabe in LUA oder redis wird langsam).
So, in diesem script fügen Sie Ihre SPOP und RPOP, können Sie hängen die Ergebnisse von jedem redis-Befehl in einer LUA-array für die Instanz und dann wieder das array, um Ihre redis-client.
Was die Dokumentation sagt über MULTI ist, dass es das optimistische sperren, das heißt, es wird wiederholt tun, die multi-Ding mit der UHR, bis der überwachte Wert wird nicht geändert. Wenn Sie viele schreibt auf die beobachtete Wert, es wird langsamer sein als 'pessimistisch' sperren (wie viele SQL-Datenbanken: POSTGRESQL, MYSQL,...), die in gewisser Weise "Stoppt die Welt", um für die Abfrage zuerst ausgeführt werden. Pessimistisches sperren ist nicht implementiert in redis, aber Sie implementieren können, wenn Sie wollen, aber es ist Komplex und vielleicht brauchst du es nicht (nicht so viele Schreibvorgänge auf diesem Wert: optimistisch sein sollte, völlig ausreichend).
InformationsquelleAutor der Antwort zenbeni
können Sie wahrscheinlich versuchen, ein lua-script (script.lua) wie folgt:
rufen Sie es auf diese Weise :
InformationsquelleAutor der Antwort Philippe T.
Redis 4.0+ unterstützt nun die Module hinzu, die alle Arten von neuen Funktionen und Datentypen mit schneller und sicherer verarbeiten als Lua-Skripte oder
multi
/exec
Rohrleitungen.Redis Labs, der aktuelle sponsor hinter Redis, hat eine nützliche extension Module genannt REDEX höchste hier: https://github.com/RedisLabsModules/redex
Den
rxlists
Modul beinhaltet verschiedene Liste der Operationen einschließlichLMPOP
undRMPOP
so können Sie atomar pop mehrerer Werte aus einer Redis-Liste. Die Logik ist immer noch O(n) (im Grunde dabei ein einziges pop in einer Schleife), aber alles, was Sie tun müssen, ist installieren Sie das Modul einmal und nur senden, benutzerdefinierten Befehl. Ich benutze es auf Listen mit Millionen von Artikeln und Tausende tauchten auf einmal generieren 500MB+ der Netzwerk-traffic, ohne Frage.InformationsquelleAutor der Antwort Mani Gandham