Login
Newsletter
Werbung

Do, 20. September 2012, 15:00

Redis – Mehr als ein Key-Value-Store

Lists

Lists, also Listen, enthalten in Redis einfach eine Reihe von Strings mit unveränderlicher Reihenfolge. Die Datenbank kann neue Werte sowohl am Anfang, am Ende, als auch an einem vorzugebenden Index einfügen und entfernen. Der Index ist dabei, wie in den meisten Programmiersprachen auch, null-basiert.

Dazu ein paar Beispiele. Als Erstes wird ein Wert links zur Liste hinzugefügt. Da die Liste noch nicht existiert, wird diese angelegt:

redis 127.0.0.1:6379> LPUSH Audioplayer Banshee
(integer) 1

Jetzt wird ein Wert an einer bestimmten Position hinzugefügt. Existiert dort schon ein Wert, wird dieser direkt überschreiben:

redis 127.0.0.1:6379> LSET Audioplayer 0 Rhythmbox
OK

Will man alle Werte anzeigen, nutzt man LRANGE. -1 bedeutet dabei »der 1. Wert von hinten«:

redis 127.0.0.1:6379> LRANGE Audioplayer 0 -1
1) "Rhythmbox"

Das Einfügen geht auch an verschiedenen Stellen:

redis 127.0.0.1:6379> LPUSH Audioplayer Banshee
(integer) 2
redis 127.0.0.1:6379> RPUSH Audioplayer Winamp
(integer) 3
redis 127.0.0.1:6379> LINSERT Audioplayer AFTER Banshee "Quod Libet"
(integer) 4

Die Anzeige aller Werte zeigt entsprechend mehr Einträge:

redis 127.0.0.1:6379> LRANGE Audioplayer 0 -1
1) "Banshee"
2) "Quod Libet"
3) "Rhythmbox"
4) "Winamp"

Mittels LRANGE kann man auch nur Teilbereiche abfragen:

redis 127.0.0.1:6379> LRANGE Audioplayer 0 1
1) "Banshee"
2) "Quod Libet"
redis 127.0.0.1:6379> LRANGE Audioplayer -2 -1
1) "Rhythmbox"
2) "Winamp"

Die Abfrage der Werte von Index -1 bis -2 entspricht dem letzten und vorletzten Wert.

Wie von Queues gewohnt, kann man bei Listen auch den ersten Wert abrufen und entfernen:

redis 127.0.0.1:6379> LPOP Audioplayer
"Banshee"

Will man nur einen bestimmten Wert abfragen, nutzt man LINDEX:

redis 127.0.0.1:6379> LINDEX Audioplayer 1
"Rhythmbox"

Es geht auch komplizierter, z.B. das Entfernen des letzten Werts einer Liste und gleichzeitiges Hinzufügen am Anfang einer anderen Liste. Wenn diese nicht existiert, wird sie direkt angelegt:

redis 127.0.0.1:6379> RPOPLPUSH Audioplayer WindowsAudioplayer 
"Winamp"
redis 127.0.0.1:6379> LRANGE WindowsAudioplayer 0 -1
1) "Winamp"

Wie zu sehen ist, beginnen Befehle für Listen entweder mit einem L (für »left«, also links) oder einen R (für »right«, also rechts), je nach dem, ob die Operation sich auf den Anfang (= links) oder das Ende (= rechts) einer Liste auswirkt.

Redis kennt noch zwei weitere interessante Kommandos, nämlich ein blockierendes RPOP und LPOP. Dabei wird der letzte bzw. der erste Werte aus einer Liste geholt. Ist die Liste leer, wird einen vordefinierten Zeitraum lang auf ein Element gewartet.

Für das folgende Beispiel benötigt man zwei offene Redis-Kommandozeilen. Im ersten Terminal wird der erste Wert von der Liste zum Schlüssel mein_stack geholt. Ist kein Wert vorhanden, wird max 120 Sekunden gewartet:

redis 127.0.0.1:6379> BLPOP mein_stack 120

Im zweiten Terminal schreibt man den Wert foo in mein_stack:

redis 127.0.0.1:6379> LPUSH mein_stack foo
(integer) 1<

Wird der Befehl im zweiten Terminal innerhalb von 120 Sekunden ausgeführt, erscheint im ersten Terminal die folgende Ausgabe:

1) "mein_stack"
2) "foo"
(20.98s)

1) ist der Schlüssel ,2) der Wert und 20.98s) die Zeit, die gewartet wurde, bevor der Wert verfügbar war. Der äquivalente Befehl zu BLPOP, der den letzten Wert einer Liste holt, ist BRPOP. Des Weiteren gibt es auch noch BRPOPLPUSH.

Eine vollständige Übersicht über alle Befehle für Listen ist über help @list abrufbar.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung