Redis-Tutorial: Einstieg in die Datenbank-Technik

Das Datenbanksystem Redis ist in den letzten Jahren immer populärer geworden. Vorteile liegen vor allem in der Geschwindigkeit und der einfachen Struktur der Datenbanken. Daten werden direkt in den Arbeitsspeicher des Servers geschrieben und können so sehr viel schneller wieder aufgerufen werden, als man es von anderen Datenbanken her kennt. Deshalb wird Redis im Web gern als Cache eingesetzt. Doch auch Messenger-Dienste nutzen die Datenbank, um schnelle Kommunikation zu ermöglichen. Wir erklären Ihnen, wie Sie Ihre eigene Redis-Database aufsetzen können.

Schritt 1: Redis installieren

Redis ist Open Source und kann daher frei von jedem heruntergeladen, genutzt und bearbeitet werden.

Hinweis

Im Folgenden beschreiben wir, wie man Redis unter Ubuntu installiert und einrichtet. Es ist allerdings auch möglich, mit Mac oder Windows zu arbeiten. Wenn Redis zunächst nur ausprobieren wollen, ohne das System bei sich zu installieren, empfiehlt sich die Online-Testumgebung Try Redis.

In einem ersten Schritt lädt manRedis herunter. Dafür verwenden wir den Paket-Manager von Ubuntu, den wir zunächst auf den neuesten Stand bringen.

sudo apt-get update
sudo apt-get install redis-server

Alternativ lassen sich die Dateien von der offiziellen Redis-Website herunterladen. Dann muss man das Paket allerdings manuell entpacken und schließlich installieren. Im Anschluss startet man Redis mit einem einfachen Kommando.

redis-server

Um zu testen, ob Redis korrekt läuft, hilft das Interface, über das die Kommunikation mit Redis funktioniert. Dieses startet man also zuerst.

redis-cli

Nun zeigt das Interface die IP-Adresse und den Port, über den Redis läuft. Diesen kann man nun anpingen.

127.0.0.1:6397> ping
PONG

Redis antwortet und zeigt damit an, dass das Datenbanksystem erfolgreich installiert wurde. Zusätzlich kann man testen, ob man auch Inhalte setzen kann.

127.0.0.1:6397> set test "OK!"
127.0.0.1:6397> get test
"OK!"
Hinweis

Sie möchten Redis auf einem eigenen Server installieren? Die Cloud-Server von IONOS lassen sich auch für kleine Projekte skalieren.

Schritt 2: Redis konfigurieren

Redis wurde zunächst mit der Standard-Konfiguration installiert. Diese kann man sich per Befehl anzeigen lassen.

127.0.0.1:6397> config get *

In der Auflistung aller Konfigurationspunkte stehen Paare immer untereinander. Zum Punkt „dbfilename“ gehört demnach der Wert „dump.rdb“. Das Sternchen, welches wir zum Aufrufen der Liste genutzt haben, ist nur ein Platzhalter für einen bestimmten Punkt der Konfiguration. Möchte man nur dieses gezielt überprüfen, kann man den Namen des Eintrags an Stelle des Sternchens einfügen. Man sucht dabei immer nach dem oberen Anteil des Konfigurationspaares –der Schlüssel zu dem dazugehörigen Wert.

127.0.0.1:6397> config get dbfilename
1) "dbfilename"
2) "dump.rdb"

Um einen Eintrag in der Konfigurationsdatei zu ändern, verwendet man den set-Befehl. Dies kann man beispielsweise nutzen, um ein Passwort zu setzen.

127.0.0.1:6397> config set requirepass "password"
OK

Möchten wir nun mit get das Passwort abfragen, werden wir aufgefordert dieses erstmal einzugeben, schließlich haben wir Redis gerade gesichert. Dafür verwenden wir den Befehl auth. Anschließend können wir den Konfigurationseintrag wie beschrieben abfragen.

127.0.0.1:6397> auth "password"
127.0.0.1:6397> config get requirepass
1) "requirepass"
2) "password"
Hinweis

Es gibt noch mehr Möglichkeiten, wie Sie Ihre Datenbank absichern können. Auf der offiziellen Website haben die Entwickler verschiedene Punkte zusammengefasst.

Redis behält jegliche Datensätze eigentlich im Arbeitsspeicher. Um dennoch Persistenz zu erreichen, kann man einen Snapshot der Datenbank auf der Festplatte anlegen, der in der Datei dump.rdb abgelegt wird.

127.0.0.1:6397> save

Durch den save-Befehl haben wir manuell einen Snapshot erstellt. Die Sicherungen lassen sich aber auch automatisieren.

127.0.0.1:6397> save 60 10

In diesem Beispiel haben wir dem Befehl zwei Parameter gegeben: Nun wird alle 60 Sekunden gespeichert, falls es in diesem Zeitraum bereits zehn Änderungen gegeben hat.

Im aktiven Betrieb eignet sich der save-Befehl aber nicht so gut, denn er verhindert, dass Clients auf die Datenbank zugreifen können. Besser geeignet ist bgsave, da dieser Prozess im Hintergrund läuft.

Neben der Snapshot-Variante gibt es aber auch noch die Append Only File. Bei diesem Modus speichert Redis jeden Vorgang, den man durchgeführt hat, in einer Datei. Sollte der Redis-Server also unverhofft abstürzen, lässt sich nachvollziehen, was zuletzt durchgeführt wurde. Um den AOF-Modus zu aktivieren, muss man einer Änderung in der Konfigurationsdatei vornehmen.

127.0.0.1:6397> config set appendonly yes
Tipp

Wer maximale Sicherheit der Daten benötigt, sollte sowohl regelmäßige Snapshots erzeugen als auch den AOF-Modus aktivieren. So können praktisch keine Daten verloren gehen. Allerdings machen die Vorgänge die Datenbank zugegebenermaßen etwas langsamer.

Schritt 3: Einträge anlegen

Nachdem Sie Redis konfiguriert haben, können Sie mit der Datenbank arbeiten. Dafür verwendet man verschiedene Datentypen und unterschiedliche Befehle.

Strings

Am einfachsten lassen sich Strings setzen. Hierfür verwendet man einfach den set-Befehl.

Hinweis

Es spielt keine Rolle, ob man Anführungszeichen bei der Eingabe von Werten verwendet oder nicht. Zum besseren Lesen des Codes kann man Text in Anführungszeichen setzen, Zahlenwerte aber ohne die Markierung angeben.

127.0.0.1:6397> set foo "bar"
127.0.0.1:6397> set value 1

Ruft man die Einträge foo und value nun mit get auf, werden die entsprechenden Werte angezeigt.

127.0.0.1:6397> get foo
"bar"
127.0.0.1:6397> get value
"1"

Um einen Eintrag zu löschen, verwendet man den del-Befehl.

127.0.0.1:6397> del foo
(integer) 1
127.0.0.1:6397> get foo
(nil)

Wer nicht viele Einträge mit einer Extrazeile Code anlegen möchte, kann die erweiterte Funktion mset verwenden. Um die Werte von mehreren Einträgen gleichzeitig abzurufen, existiert parallel mget.

127.0.0.1:6397> mset foo1 "bar1" foo2 "bar2" foo3 "bar3"
OK
127.0.0.1:6397> mget foo1 foo2 foo3
1) "bar1"
2) "bar2"
3) "bar3"

Lists

Mit Redis kann man aber auch andere Datentypen verwenden. Bei der Arbeit mit der Datenbank sind z. B. Listen und Sets beliebt. Beides sind Ansammlungen von Werten. Während Sets allerdings unsortiert sind, sind die Werte in Listen durchnummeriert. Man kann in Listen Einträge hinzufügen, abfragen und wieder löschen.

127.0.0.1:6397> lpush mylist foo
(integer) 1
127.0.0.1:6397> lpush mylist bar
(integer) 2
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "bar"
127.0.0.1:6397> linsert mylist before "bar" "test"
(integer) 3
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "test"
3) "bar"
127.0.0.1:6397> lrem mylist 0 foo
(integer) 1
127.0.0.1:6397> lrange mylist 0 10
1) "test"
2) "bar"

In diesem Beispiel haben wir zunächst zwei Elemente in eine Liste eingefügt (lpush) und uns diese anzeigen lassen. Bei dem Befehl lrange gibt man an, welcher Bereich (hier 0 bis 10) wiedergegeben werden soll, wobei man auch negative Zahlen verwenden kann. Anschließend haben wir mit linsert einen weiteren Wert vor einen bestehenden eingefügt (auch after wäre hier möglich) und damit die Nummerierung verändert. Der Befehl lrem kann Einträge mit einem spezifischen Wert aus der Liste löschen.

Sets

Für Sets kennt Redis andere Befehle, die aber ähnliche Ergebnisse liefern:

127.0.0.1:6397> sadd myset "foo"
(integer) 1
127.0.0.1:6397> sadd myset "bar"
(integer) 1
127.0.0.1:6397> smembers myset
1) "bar"
2) "foo"
127.0.0.1:6397> sismember myset "bar"
(integer) 1
127.0.0.1:6397> srem myset "bar"
(integer) 1
127.0.0.1:6397> smembers myset
1) "foo"

Mit sadd lassen sich auch mehrere Elemente gleichzeitig in das Set aufnehmen, wenn man diese im Kommando nacheinander einfügt. Um sich das Set anzeigen zu lassen, reicht der Befehl smembers und der Name des gewünschten Sets. Über den Befehl sismember kann man zudem nach einem bestimmten Eintrag suchen. Analog zur Liste kann man mit srem einzelne Einträge löschen.

Redis gibt Nutzern aber auch die Möglichkeit, Sets in einem sortierten Format zu verwenden.

127.0.0.1:6397> zadd mysortedset 1 "foo"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "bar"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "foobar"
(integer) 1
127.0.0.1:6397> zrange mysortedset 0 10
1) "foo"
2) "bar"
3) "foobar"

Zum Hinzufügen von Elementen verwendet man bei dieser Variante den Befehl zadd und einen Score. Während die Werte selbst nicht mehrfach auftreten können, darf man beim Score mehrfach die gleiche Zahl angeben. Der Score ist also keine direkte Nummerierung innerhalb des Sets, sondern eine Gewichtung. Alle Einträge mit dem Score 2 kommen nach den Elementen mit dem Score 1. Anzeigen lassen kann man sich alle oder nur ausgewählte Einträge mit zrange.

Hashes

Eine Besonderheit stellt der Datentyp Hash dar. Hierbei handelt es sich, ähnlich wie bei Sets und Listen, um einzelne Einträge, die mehrere Werte enthalten können. Allerdings gibt es im Sinne von Key-Value-Paaren zu jedem Wert auch einen Schlüssel.

127.0.0.1:6397> hset user1 name "bob" email "bob@example.com" password "rK87_x"
OK
127.0.0.1:6397> hget user1 name
1) "bob"
127.0.0.1:6397> hgetall user1
1) "name"
2) "bob"
3) "email"
4) "bob@example.com"
5) "password"
6) "rK87_x"
127.0.0.1:6397> hvals user1
1) "bob"
2) "bob@example.com"
3) "rK87_x"
127.0.0.1:6397> hkeys user1
1) "name"
2) "email"
3) "password"
> hdel user1 password
(integer) 1
127.0.0.1:6397> hgetall user1
1) "name"
2) "bob"
3) "email"
4) "bob@example.com"
127.0.0.1:6397> del user1
(integer) 1
127.0.0.1:6397> hgetall user1
(empty list or set)

In diesem Beispiel haben wir mit hset einen Hash mit dem Namen user1 erstellt. Der Hash hat drei Felder. Über den Befehl hget kann der Wert von jedem Feld einzeln aufgerufen werden. Um sich alle anzeigen zu lassen, kann man hgetall verwenden. Weitere Abfragemöglichkeiten erhält man durch hvals (zeigt alle im Hash gespeicherten Werte an) und hkeys (zeigt alle im Hash gespeicherten Schlüssel an). Einzelne Felder lassen sich mit hdel löschen, der komplette Hash wie gewohnt mit del.

Hinweis

Das Kommando flushall sorgt dafür, dass alle Einträge der Datenbank gelöscht werden.

Schritt 4: Weitere Optionen

Mit Redis kann man natürlich nicht nur Einträge in einer Datenbank vornehmen. Man kann den Daten auch noch bestimmte Eigenschaften verpassen. Sehr hilfreich kann beispielsweise die inkrementelle Vergrößerung oder Verkleinerung sein.

127.0.0.1:6397> set foo 1
OK
127.0.0.1:6397> get foo
"1"
127.0.0.1:6397> incr foo
(integer) 2
127.0.0.1:6397> incr foo
(integer) 3
127.0.0.1:6397> get foo
"3"
127.0.0.1:6397> decr foo
(integer) 2
127.0.0.1:6397> get foo
"2"

Mithilfe dieser Funktionen kann man also Werte um eins erhöhen oder verringern. Manchmal möchte man aber auch Werte setzen, die nur für eine bestimmte Zeitspanne in der Datenbank vorhanden sind. Dabei hilft die Funktion expire.

127.0.0.1:6397> set foo "bar"
OK
127.0.0.1:6397> expire foo 100
(integer) 1
127.0.0.1:6397> ttl foo
(integer) 50
127.0.0.1:6397> ttl foo
(integer) -50
127.0.0.1:6397> get foo
(nil)

Der expire-Befehl verlangt eine Zeitspanne in Sekunden. In diesem Beispiel haben wir die Haltbarkeit des Eintrags also auf 100 Sekunden gesetzt. Nach der Hälfte der Zeit haben wir mit dem Befehl ttl nach der Time-to-live gefragt, also die verbleibende Zeit. Wartet man noch länger, geht die TTL in einen negativen Bereich. Der Eintrag besteht zu diesem Zeitpunkt nicht mehr.

Mit dem Befehl setex lässt sich ein Eintrag in der Datenbank direkt beim Erstellen mit einer TTL verknüpfen.

127.0.0.1:6397> setex foo 100 "bar"
OK

Ist ein Eintrag erstmal angelegt, kann man diesen auch erweitern. Das Kommando append fügt dem hinterlegten Wert einen weiteren hinzu.

127.0.0.1:6397> set foo "Hello"
OK
127.0.0.1:6397> append foo " World"
(integer) 11
127.0.0.1:6397> get foo
"Hello World"
127.0.0.1:6397> set bar 5
OK
127.0.0.1:6397> append bar 10
(integer) 3
127.0.0.1:6397> get bar
"510"

Wie man sehen kann, wenn man die entsprechenden Werte wieder aufruft: Die neuen Komponenten werden einfach an den bestehenden Wert angehängt. Sollte der Eintrag noch nicht bestehen, wirkt append genau wie set.

Des Weiteren lassen sich Einträge durch den Befehl rename auch umbenennen.

127.0.0.1:6397> set foo 100
OK
127.0.0.1:6397> rename foo bar
OK
127.0.0.1:6397> get foo
(nil)
127.0.0.1:6397> get bar
"100"
Tipp

Es gibt noch viele weitere Befehle, um mit Redis korrekt zu arbeiten. In der offiziellen Dokumentation kann man alle verfügbaren Kommandos mit Beschreibung nachlesen.


Bringen Sie Ihr Weihnachtsgeschäft
auf Erfolgskurs
Stark reduziert: Drei Business-Lösungen für Ihre vorweihnachtliche
Verkaufsoffensive. Angebote gültig bis zum 30.11.2020.