Redis lagert jedoch keine Kerzen, sondern speichert Datenstrukturen, d.h. Daten unterschiedlicher Formen, was im Logo recht schön zum Ausdruck kommt:
Vier Kerzen, vier Datentypen: Zwar kennt Redis noch mehr, aber diese vier werden wir heute betrachten:
- String: Eine Zeichenkette, die aber auch als Zahl interpretiert werden kann.
- List: Mehrere Einträge in einer verketteten(!) Liste.
- Set: Mengen mit eindeutigen Elementen.
- Hash: Mehrere Einträge als Schlüssel/Wert-Paare.
Setup
Bevor wir mit diesen Datentypen arbeiten können, müssen wir aber Redis zuerst einmal installieren und starten. Hierfür gibt es das Package redis:
Code: Alles auswählen
# apt install -y redis
# systemctl start redis-server.service
Code: Alles auswählen
$ redis-cli
127.0.0.1:6379>
Code: Alles auswählen
> PING
PONG
Code: Alles auswählen
> HELP PING
PING [message]
summary: Ping the server
since: 1.0.0
group: connection
Einfache Werte
Redis kann man sich wie eine grosse Map vorstellen. Eine Map speichert Daten als Schlüssel/Wert-Paare und kann somit als Verallgemeinerung des Arrays gesehen werden. (Bei einem Array sind die Schlüssel Zahlen von 0 bis n-1, wobei n die Anzahl der Elemente ist; bei einer Map kann man beliebige Schlüssel verwenden.)
Speichern wir also einige Werte mit SET ab:
Code: Alles auswählen
> SET day 1
OK
> SET month December
OK
> SET year 2022
OK
Code: Alles auswählen
> KEYS *
1) "year"
2) "month"
3) "day"
Code: Alles auswählen
> GET day
"1"
Code: Alles auswählen
> INCR day
(integer) 2
> GET day
"2"
> GET month
"December"
Listen
Eine Liste ist kein Array, sondern eine verkettete Liste. Darum ist der Zugriff auf ein Element eine Operation der Ordnung O(n), das Anhängen vorne und hinten erfolgt jedoch in konstanter Zeit, sprich O(1). Legen wir also eine todo-Liste an:
Code: Alles auswählen
> LPUSH todo work eat sleep
(integer) 3
Code: Alles auswählen
> LRANGE todo 0 -1
1) "sleep"
2) "eat"
3) "work"
Code: Alles auswählen
> RPUSH todo "Tuerchen oeffnen"
(integer) 4
> LINDEX todo 3
1) "Tuerchen oeffnen"
> LRANGE todo 0 -1
1) "sleep"
2) "eat"
3) "work"
4) "Tuerchen oeffnen"
Nun wollen wir aber auch eine Liste mit bereits erledigten Aufgaben anlegen:
Code: Alles auswählen
> LPUSH done aufstehen
(integer) 1
> LRANGE done 0 -1
1) "aufstehen"
Code: Alles auswählen
> MULTI
> RPOP done
QUEUED
> DISCARD
OK
Code: Alles auswählen
> MULTI
> RPOP todo
QUEUED
> LPUSH done "Tuerchen oeffnen"
QUEUED
> EXEC
1) "Tuerchen oeffnen"
2) (integer) 2
Code: Alles auswählen
> LRANGE todo 0 -1
1) "sleep"
2) "eat"
3) "work"
> LRANGE done 0 -1
1) "Tuerchen oeffnen"
2) "aufstehen"
Code: Alles auswählen
> RPOPLPUSH todo done
"work"
Sets
Ein Set ist eine Menge, d.h. eine Sammlung von Werten, in der jeder Wert eindeutig ist. Beschäftigen wir uns mit Zahlenreihen, genauer mit der 2er- und der 3er-Reihe. Mit SADD können wir einem Set Werte hinzufügen. Das Set wird bei Bedarf gleich erstellt:
Code: Alles auswählen
> SADD two-times-table 2 4 6 8 10 12 14 16 18 20
(integer) 10
> SADD three-times-table 3 6 9 12 15 18 21 24 27 30
(integer) 10
Code: Alles auswählen
> SUNION two-times-table three-times-table
1) "2"
2) "3"
3) "4"
4) "6"
5) "8"
6) "9"
7) "10"
8) "12"
9) "14"
10) "15"
11) "16"
12) "18"
13) "20"
14) "21"
15) "24"
16) "27"
17) "30"
> SINTER two-times-table three-times-table
1) "6"
2) "12"
3) "18"
> SDIFF three-times-table two-times-table
1) "3"
2) "9"
3) "15"
4) "21"
5) "24"
6) "27"
7) "30"
Der Hash-Datentyp passt auch noch gerade so knapp in dieses erste Türchen.
Hashes
Mit dem Hash können Werte mit Unterwerten abgespeichert werden. Im Gegensatz zu einer Liste speichert man damit eher heterogene Werte ab, z.B. Eigenschaften von Forenteilnehmern.
Mit HSET kann ein neuer hash erstellt werden; der Befehl erwartet paarweise Schlüssel/Wert-Paare als weitere Argumente:
Code: Alles auswählen
> HSET paedubucher posts 624 location Schweiz license GFDL
(integer) 3
Code: Alles auswählen
> HGETALL paedubucher
HGETALL paedubucher
1) "posts"
2) "624"
3) "location"
4) "Schweiz"
5) "license"
6) "GFDL"
Code: Alles auswählen
> HGET paedubucher posts
"624"
Code: Alles auswählen
> HINCRBY paedubucher posts 1
(integer) 625
Redis ist kein Datenfriedhof, sondern interagiert sehr gut mit der Aussenwelt. Neben zahlreichen Sprachbindungen gibt es auch die Möglichkeit, Daten im CSV- oder JSON-Format zu exportieren:
Code: Alles auswählen
$ redis-cli --csv HGETALL paedubucher
"posts","625","location","Schweiz","license","GFDL"
$ redis-cli --json HGETALL paedubucher
{"posts":"625","location":"Schweiz","license":"GFDL"}
Video
Ein Türchen wurde auch sogleich auf YouTube aufgemacht.