# Redis-Tutorial: Einstieg in die Datenbank-Technik

Das Datenbanksystem [Redis](https://www.ionos.de/digitalguide/hosting/hosting-technik/was-ist-redis/ "Was ist 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](http://try.redis.io/ "Try Redis auf der offiziellen Homepage von Redis").

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

```none
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.

```none
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.

```none
redis-cli
```

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

```none
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.

```none
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](https://www.ionos.de/cloud/cloud-server "Cloud-Server mieten") 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.

```none
127.0.0.1:6397> config get *
```

[![Bild: Auszug der Konfigurationsdatei von Redis](https://www.ionos.de/digitalguide/fileadmin/_processed_/5/4/csm_redis-konfigurationsdatei_74a168f586.webp "Auszug der Konfigurationsdatei von Redis")](https://www.ionos.de/digitalguide/fileadmin/DigitalGuide/Screenshots_2020/redis-konfigurationsdatei.png) Auszug der Konfigurationsdatei von Redis 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.

```none
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.

```none
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.

```none
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](https://redis.io/topics/security "Redis Security").

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.

```none
127.0.0.1:6397> save
```

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

```none
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.

```none
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.

```none
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.

```none
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**.

```none
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***.

```none
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.

```none
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:

```none
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.

```none
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.

```none
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.

```none
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***.

```none
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.

```none
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.

```none
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.

```none
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](https://redis.io/commands "Beschreibung aller Redis-Befehle") mit Beschreibung nachlesen.


This is a markdown version of: [https://www.ionos.de/digitalguide/hosting/hosting-technik/redis-tutorial/](https://www.ionos.de/digitalguide/hosting/hosting-technik/redis-tutorial/) for AI/LLM consumption.