Wie man Redis-Datenbanken und Schlüssel verwaltet

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:

  1. 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:

  1. 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:

  1. 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 soll
  • REPLACE: Gibt an, dass, wenn der Schlüssel bereits auf dem Ziel vorhanden ist, die migrate-Operation ihn löschen und ersetzen soll
  • KEYS: Anstatt einen bestimmten Schlüssel zum Migrieren anzugeben, können Sie einen leeren String ("") eingeben und dann die Syntax des keys-Befehls verwenden, um jeden Schlüssel zu migrieren, der zu einem Muster passt. Für weitere Informationen darüber, wie keys 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:

  1. rename old_key new_key

Sie können randomkey verwenden, um einen zufälligen Schlüssel aus der aktuell ausgewählten Datenbank zurückzugeben:

  1. 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.

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

/etc/redis/redis.conf
. . .
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.

  1. 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:

  1. 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:

  1. 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:

  1. 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