Einführung
Redis ist ein Open-Source, in-memory Key-Value-Datenspeicher. Ein Key-Value-Datenspeicher ist ein Typ von NoSQL-Datenbank, bei dem Keys als eindeutige Identifikatoren für ihre zugehörigen Values dienen. Jede Redis-Instanz enthält eine Anzahl von Datenbanken, von denen jede viele verschiedene Keys verschiedener Datentypen enthalten kann.
In diesem Tutorial erfahren Sie, wie Sie eine Datenbank auswählen, Keys zwischen Datenbanken verschieben sowie Keys verwalten und löschen.
Wie Sie diesen Leitfaden verwenden
Dieser Leitfaden ist als Spickzettel mit eigenständigen Beispielen verfasst. Wir ermutigen Sie, zu jeder Sektion zu springen, die für die Aufgabe relevant ist, die Sie abschließen möchten.
Die in dieser Anleitung gezeigten Befehle wurden auf einem Ubuntu 22.04 Server mit Redis Version 6.0.16 getestet. Um eine ähnliche Umgebung einzurichten, können Sie Schritt 1 unserer Anleitung zur Installation und Absicherung von Redis unter Ubuntu 22.04 befolgen. Wir werden demonstrieren, wie sich diese Befehle verhalten, indem wir sie mit redis-cli
, der Redis-Befehlszeilenschnittstelle, ausführen. Beachten Sie, dass sich der genaue Output bestimmter Befehle ändern kann, wenn Sie eine andere Redis-Schnittstelle verwenden, z.B. Redli.
Alternativ können Sie eine verwaltete Redis-Datenbankinstanz bereitstellen, um diese Befehle zu testen. Je nachdem, welches Maß an Kontrolle Ihr Datenbankanbieter zulässt, funktionieren möglicherweise einige Befehle in dieser Anleitung nicht wie beschrieben. Um eine DigitalOcean Managed Database bereitzustellen, folgen Sie unserer Produktdokumentation zu Managed Databases. Anschließend müssen Sie entweder Redli installieren oder einen TLS-Tunnel einrichten, um eine Verbindung zur Managed Database über TLS herzustellen.
Verwaltung von Datenbanken
Standardmäßig unterstützt eine Redis-Instanz 16 logische Datenbanken. Diese Datenbanken sind effektiv voneinander isoliert, und wenn Sie einen Befehl in einer Datenbank ausführen, hat dies keine Auswirkungen auf die Daten, die in anderen Datenbanken Ihrer Redis-Instanz gespeichert sind.
Redis-Datenbanken sind von 0
bis 15
nummeriert, und standardmäßig stellen Sie eine Verbindung zur Datenbank 0
her, wenn Sie sich mit Ihrer Redis-Instanz verbinden. Sie können jedoch die verwendete Datenbank mit dem select
-Befehl nach der Verbindung ändern:
- select 15
Wenn Sie eine andere Datenbank als 0
ausgewählt haben, wird dies im redis-cli
-Prompt angezeigt:
-
Um alle Daten, die in einer Datenbank gespeichert sind, mit den Daten in einer anderen Datenbank auszutauschen, verwenden Sie den swapdb
-Befehl. Das folgende Beispiel tauscht die in Datenbank 6
gespeicherten Daten mit den Daten in Datenbank 8
aus, und alle an beide Datenbanken angeschlossenen Clients können Änderungen sofort implementieren:
- swapdb 6 8
swapdb
gibt OK
zurück, wenn der Austausch erfolgreich ist.
Wenn Sie einen Schlüssel auf eine andere Redis-Instanz verschieben möchten, können Sie migrate
ausführen. Dieser Befehl stellt sicher, dass der Schlüssel auf der Zielinstanz vorhanden ist, bevor er von der Quellinstanz gelöscht wird. Wenn Sie migrate
ausführen, muss der Befehl die folgenden Elemente in dieser Reihenfolge enthalten:
- Der Hostname oder die IP-Adresse der Ziel-Datenbank
- Die Portnummer der Ziel-Datenbank
- Der Name des Schlüssels, den Sie migrieren möchten
- Die Datenbanknummer, unter der Sie den Schlüssel in der Zielinstanz speichern möchten
- A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time
Um es zu veranschaulichen, hier ist ein Beispiel:
- migrate 203.0.113.0 6379 key_1 7 8000
Zusätzlich erlaubt migrate
die folgenden Optionen, die Sie nach dem Timeout-Argument hinzufügen können:
COPY
: Gibt an, dass der Schlüssel nicht von der Quellinstanz gelöscht werden sollREPLACE
: Gibt an, dass, wenn der Schlüssel bereits auf dem Ziel vorhanden ist, diemigrate
-Operation ihn löschen und ersetzen sollKEYS
: Anstatt einen bestimmten Schlüssel zum Migrieren anzugeben, können Sie einen leeren String (""
) eingeben und dann die Syntax deskeys
-Befehls verwenden, um jeden Schlüssel zu migrieren, der zu einem Muster passt. Für weitere Informationen darüber, wiekeys
funktioniert, lesen Sie unser Tutorial zu Problemen bei der Fehlerbehebung in Redis.
Verwaltung von Schlüsseln
Es gibt eine Reihe von Redis-Befehlen, die nützlich sind, um Schlüssel unabhängig von ihrem Datentyp zu verwalten. Einige dieser Befehle werden im folgenden Abschnitt behandelt.
rename
benennt den angegebenen Schlüssel um. Wenn dies erfolgreich ist, gibt es OK
zurück:
- rename old_key new_key
Sie können randomkey
verwenden, um einen zufälligen Schlüssel aus der aktuell ausgewählten Datenbank zurückzugeben:
- randomkey
Output"any_key"
Verwenden Sie type
, um den Datentyp des angegebenen Schlüssels zu bestimmen. Die Ausgabe dieses Befehls kann entweder string
, list
, hash
, set
, zset
oder stream
sein.
- type key_1
Output"string"
Wenn der angegebene Schlüssel nicht existiert, gibt type
stattdessen none
zurück.
Sie können einen einzelnen Schlüssel in eine andere Datenbank in Ihrer Redis-Instanz mit dem Befehl move
verschieben. move
nimmt den Namen eines Schlüssels und die Datenbank, in die Sie den Schlüssel verschieben möchten, als Argumente. Um beispielsweise den Schlüssel key_1
in die Datenbank 8
zu verschieben, führen Sie folgendes aus:
- move key_1 8
move
gibt OK
zurück, wenn das Verschieben des Schlüssels erfolgreich war.
Schlüssel löschen
Um einen oder mehrere Schlüssel beliebigen Datentyps zu löschen, verwenden Sie den Befehl del
, gefolgt von einem oder mehreren Schlüsseln, die Sie löschen möchten:
- del key_1 key_2
Wenn dieser Befehl die Schlüssel erfolgreich löscht, gibt er (integer) 1
zurück. Andernfalls gibt er (integer) 0
zurück.
Der Befehl unlink
führt eine ähnliche Funktion wie del
aus, mit dem Unterschied, dass del
den Client blockiert, während der Server den vom Schlüssel belegten Speicher zurückfordert. Wenn der zu löschende Schlüssel mit einem kleinen Objekt verbunden ist, ist die Zeit, die del
benötigt, um den Speicher zurückzugewinnen, sehr gering und die Blockierungszeit ist möglicherweise nicht einmal bemerkbar.
Jedoch kann es umständlich werden, wenn beispielsweise der zu löschende Schlüssel mit vielen Objekten verknüpft ist, wie etwa einem Hash mit Tausenden oder Millionen von Feldern. Das Löschen eines solchen Schlüssels kann eine spürbar lange Zeit in Anspruch nehmen, und Sie werden daran gehindert, andere Operationen durchzuführen, bis er vollständig aus dem Speicher des Servers entfernt ist.
unlink
bestimmt jedoch zunächst die Kosten für das Freigeben des Speichers, der vom Schlüssel belegt wird. Wenn es gering ist, funktioniert unlink
genauso wie del
, indem der Schlüssel sofort gelöscht wird, während gleichzeitig der Client blockiert wird. Wenn jedoch hohe Kosten für das Freigeben von Speicher für einen Schlüssel anfallen, wird unlink
den Schlüssel asynchron löschen, indem ein weiterer Thread erstellt wird und der Speicher schrittweise im Hintergrund zurückgewonnen wird, ohne den Client zu blockieren:
- unlink key_1
Da es im Hintergrund läuft, wird im Allgemeinen empfohlen, unlink
zum Entfernen von Schlüsseln von Ihrem Server zu verwenden, um Fehler auf Ihren Clients zu reduzieren, obwohl del
in vielen Fällen ebenfalls ausreicht.
Warnung: Die folgenden beiden Befehle gelten als gefährlich. Die Befehle flushdb
und flushall
löschen unwiderruflich alle Schlüssel in einer einzigen Datenbank bzw. in allen Datenbanken auf dem Redis-Server. Es wird empfohlen, diese Befehle nur auszuführen, wenn Sie absolut sicher sind, dass Sie alle Schlüssel in Ihrer Datenbank oder Ihrem Server löschen möchten.
Es könnte in Ihrem Interesse liegen, diese Befehle in etwas umzubenennen, das weniger wahrscheinlich versehentlich ausgeführt wird.
Um alle Schlüssel in der ausgewählten Datenbank zu löschen, verwenden Sie den Befehl flushdb
:
- flushdb
Um alle Schlüssel in jeder Datenbank auf einem Redis-Server zu löschen (einschließlich der aktuell ausgewählten Datenbank), führen Sie flushall
aus:
- flushall
Sowohl flushdb
als auch flushall
akzeptieren die Option async
, mit der Sie alle Schlüssel in einer einzelnen Datenbank oder in allen Datenbanken im Cluster asynchron löschen können. Dadurch funktionieren sie ähnlich wie der Befehl unlink
und erstellen einen neuen Thread, um den Speicher im Hintergrund inkrementell freizugeben.
Sichern Ihrer Datenbank
Um eine Sicherung der aktuell ausgewählten Datenbank zu erstellen, können Sie den Befehl save
verwenden:
- save
Dadurch wird eine Momentaufnahme des aktuellen Datensatzes als .rdb
-Datei exportiert, die eine Datenbankdump-Datei ist und die Daten in einem internen, komprimierten Serialisierungsformat enthält.
save
wird synchron ausgeführt und blockiert andere Clients, die mit der Datenbank verbunden sind. Daher empfiehlt die Dokumentation des save
Befehls, dass dieser Befehl in einer Produktionsumgebung fast nie ausgeführt werden sollte. Stattdessen wird empfohlen, den bgsave
Befehl zu verwenden. Dieser Befehl teilt Redis mit, die Datenbank zu forken: Der Elternprozess wird weiterhin Clients bedienen, während der Kindprozess die Datenbank speichert, bevor er beendet wird:
- bgsave
Beachten Sie, dass Änderungen, die während der Ausführung des bgsave
Befehls vorgenommen werden, nicht im Schnappschuss erfasst werden.
Sie können auch die Redis-Konfigurationsdatei bearbeiten, um Redis anzuweisen, automatisch einen Schnappschuss (bekannt als Snapshotting oder RDB Modus) nach einer bestimmten Zeit zu speichern, wenn eine Mindestanzahl von Änderungen an der Datenbank vorgenommen wurde. Dies wird als Speicherpunkt bezeichnet. Die folgenden Einstellungen für die Speicherpunkte sind standardmäßig in der Datei redis.conf
aktiviert:
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .
Mit diesen Einstellungen exportiert Redis alle 900 Sekunden einen Schnappschuss der Datenbank in die durch den Parameter dbfilename
definierte Datei, wenn mindestens ein Schlüssel geändert wurde, alle 300 Sekunden, wenn mindestens 10 Schlüssel geändert wurden, und alle 60 Sekunden, wenn mindestens 10000 Schlüssel geändert wurden.
Sie können den Befehl shutdown
verwenden, um Ihre Redis-Daten zu sichern und dann die Verbindung zu schließen. Dieser Befehl blockiert jeden Client, der mit der Datenbank verbunden ist, und führt dann eine save
Operation aus, wenn mindestens ein Speicherpunkt konfiguriert ist, was bedeutet, dass die Datenbank in ihrem aktuellen Zustand in eine .rdb
Datei exportiert wird, während Clients daran gehindert werden, Änderungen vorzunehmen.
Zusätzlich wird der Befehl shutdown
Änderungen an Redis‘ append-only Datei vor dem Beenden ablegen, wenn der append-only Modus aktiviert ist. Der append-only Datei Modus (AOF) beinhaltet das Erstellen eines Protokolls jeder Schreiboperation auf dem Server in einer Datei mit der Endung .aof
nach jeder Momentaufnahme. AOF- und RDB-Modi können auf dem gleichen Server aktiviert werden, und die Verwendung beider Persistenzmethoden ist eine effektive Möglichkeit, Ihre Daten zu sichern.
Kurz gesagt, ist der shutdown
Befehl im Wesentlichen ein blockierender save
Befehl, der auch alle kürzlichen Änderungen an der append-only Datei ablegt und die Verbindung zum Redis-Instanz schließt:
Warnung: Der shutdown
Befehl wird als gefährlich betrachtet. Indem Sie die Clients Ihres Redis-Servers blockieren, können Sie Ihre Daten für Benutzer und Anwendungen, die darauf angewiesen sind, nicht verfügbar machen. Es wird empfohlen, diesen Befehl nur auszuführen, wenn Sie Redis‘ Verhalten testen oder wenn Sie sicher sind, dass Sie alle Clients Ihres Redis-Servers blockieren möchten.
Tatsächlich könnte es in Ihrem Interesse liegen, diesen Befehl umzubenennen zu etwas, das weniger wahrscheinlich versehentlich ausgeführt wird.
- shutdown
Wenn Sie keine Sicherungspunkte konfiguriert haben, aber dennoch möchten, dass Redis einen save
-Vorgang durchführt, fügen Sie die save
-Option dem shutdown
-Befehl hinzu:
- shutdown save
Wenn Sie mindestens einen Speicherpunkt konfiguriert haben, aber den Redis-Server herunterfahren möchten, ohne einen Speichervorgang durchzuführen, können Sie das Argument nosave
zu dem Befehl hinzufügen:
- shutdown nosave
Beachten Sie, dass die append-only Datei im Laufe der Zeit sehr lang werden kann. Sie können jedoch Redis so konfigurieren, dass die Datei basierend auf bestimmten Variablen neu geschrieben wird, indem Sie die Datei redis.conf
bearbeiten. Sie können Redis auch anweisen, die append-only Datei durch den Befehl bgrewriteaof
neu zu schreiben:
- bgrewriteaof
bgrewriteaof
erstellt die kürzeste Abfolge von Befehlen, die benötigt werden, um die Datenbank in ihren aktuellen Zustand zurückzubringen. Wie der Name des Befehls andeutet, wird er im Hintergrund ausgeführt. Wenn jedoch bereits ein anderer Persistenzbefehl in einem Hintergrundprozess läuft, muss dieser Befehl abgeschlossen sein, bevor Redis bgrewriteaof
ausführt.
Abschluss
Dieser Leitfaden erläutert eine Reihe von Befehlen zur Verwaltung von Datenbanken und Schlüsseln. Wenn es andere verwandte Befehle, Argumente oder Verfahren gibt, die Sie in diesem Leitfaden erfahren möchten, fragen Sie bitte oder geben Sie Anregungen in den Kommentaren.
Weitere Informationen zu Redis-Befehlen finden Sie in unserer Tutorial-Serie zu Wie man eine Redis-Datenbank verwaltet.
Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys