Holen Sie sich alle Schlüssel in der Redis-Datenbank mit Python

Olorunfemi Akinlua 15 Februar 2024
  1. Verwenden Sie keys(), um alle Schlüssel in der Redis-Datenbank abzurufen
  2. Verwenden Sie scan_iter(), um alle Schlüssel in der Redis-Datenbank abzurufen
  3. Verwenden Sie zip_longest, um alle Schlüssel in der Redis-Datenbank abzurufen
Holen Sie sich alle Schlüssel in der Redis-Datenbank mit Python

Das Redis-Designsystem wird Ihnen vertraut sein, wenn Sie JSON kennen. Es verwendet eine key-value-Struktur und einen verteilten und In-Memory-Ansatz, um eine widerstandsfähige Datenbank zu erreichen.

Hashes, Listen, Sets, sortierte Sets, Strings, JSON und Streams sind eine der vielen Datenstrukturen, die Redis unterstützt. Diese Open-Source-Datenbank unterstützt verschiedene Sprachen, einschließlich Python, und wenn Sie damit ein Backend-System entwickeln, helfen einige Module und Pakete dabei.

Eine der vielen Operationen, die Sie häufig mit Datenbanken durchführen würden, ist das Abrufen von Daten, und in einer Datenbank wie Redis sind die Schlüssel wichtig, um eine solche Operation durchzuführen.

In diesem Artikel wird erläutert, wie Sie alle Schlüssel in einer Redis-Datenbank erhalten.

Verwenden Sie keys(), um alle Schlüssel in der Redis-Datenbank abzurufen

Um redis nutzen zu können, müssen wir es installiert haben; Sie können auf der Redis-Download-Seite nachsehen, wie das geht. Für Linux- und MacOS-Benutzer ist es ziemlich einfacher; Windows-Benutzer müssen jedoch möglicherweise das Windows-Subsystem für Linux (WSL2) verwenden, und Sie können dessen Anweisungen folgen Videoanleitung.

Unter der Annahme, dass Sie Ihre Redis-Datenbank eingerichtet haben, installieren wir das Paket redis, das den Clientzugriff auf die Redis-Datenbank ermöglicht. Um es zu installieren, verwenden wir den Befehl pip.

pip install redis

Ausgang:

Collecting redis
  Downloading redis-4.3.4-py3-none-any.whl (246 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 246.2/246.2 kB 794.4 kB/s eta 0:00:00
Collecting deprecated>=1.2.3
  Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting async-timeout>=4.0.2
  Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Collecting packaging>=20.4
  Downloading packaging-21.3-py3-none-any.whl (40 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.8/40.8 kB 1.9 MB/s eta 0:00:00
Collecting wrapt<2,>=1.10
  Downloading wrapt-1.14.1-cp310-cp310-win_amd64.whl (35 kB)
Collecting pyparsing!=3.0.5,>=2.0.2
  Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.3/98.3 kB 624.8 kB/s eta 0:00:00
Installing collected packages: wrapt, pyparsing, async-timeout, packaging, deprecated, redis
Successfully installed async-timeout-4.0.2 deprecated-1.2.13 packaging-21.3 pyparsing-3.0.9 redis-4.3.4 wrapt-1.14.1

Das redis-Paket verwendet also wrapt, pyparsing, async-timeout, packaging und veraltete Module, um sein Modul mit Strom zu versorgen.

Um das Paket redis nutzen zu können, müssen wir es importieren.

import redis

Kommen wir zum Hauptproblem: Wir können die Methode keys() verwenden, die vom redis-Modul bereitgestellt wird, um auf alle Schlüssel zuzugreifen und sie zu erhalten.

Die key() Methode gibt eine Liste von Schlüsseln zurück, die mit dem Muster übereinstimmen, das in ihren Argumenten aus einer bestimmten Redis-Datenbank übergeben wird. Es gibt ein Standardmuster, wenn kein Argument übergeben wird, nämlich *, was alle Schlüssel bedeutet.

Um die Methode bei der Arbeit zu zeigen, haben wir die redis-Datenbank manuell mit dem Alias Temp mit einigen Schlüsseln über die +Key-Schaltfläche oder den folgenden Code vorbelegt.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(host=redisHost, port=redisPort, decode_responses=redisDecodeRes)

r.set("ConnectionPool", "Ox1212af34w3141")

Der obige Code führt dazu, dass der Schlüssel ConnectionPool mit dem entsprechenden Wert zur Datenbank Temp hinzugefügt wird.

Die Methode set() wendet das Schlüssel-Wert-Paar auf die Datenbank an, und die Methode StrictRedis() erstellt ein Redis-Verbindungsobjekt, das uns Zugriff auf die Datenbank gewährt.

Um die Datenbank (mit dem Alias Temp) und ihre Schlüssel über eine GUI anzuzeigen, können wir die Anwendung RedisInsight verwenden, wie im Bild zu sehen.

RedisInsight

Insgesamt wurden 11 Schlüssel manuell zur Datenbank hinzugefügt, um die Methode key() zu testen.

Nun zur Methode key() müssen wir die Methode StrictRedis() verwenden, um ein Redis-Verbindungsobjekt für den Zugriff auf die Schlüssel zu erstellen. Die Argumente host, port und decode_responses werden übergeben, um die Parameter der Verbindung zu definieren.

host und port definieren den Hostnamen und die Portnummer, und decode_responses definiert, dass die übergebenen Daten in Python-Strings decodiert werden, mit denen wir problemlos arbeiten können. Die Methode keys() greift dann auf alle verfügbaren Schlüssel zu, da kein Argument übergeben wird.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(
    host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
)

print(r.keys())

Ausgang:

['bar-two', 'information', 'bar-one', 'details', 'foo', 'jinku', 'bar', 'User-One', 'delft', 'bar-three', 'ConnectionPool']

Wir haben eine Liste aller Schlüssel in der Temp-Datenbank, mit der wir arbeiten können.

Wenn wir ein Schlüsselmuster haben, das wir brauchen, können wir es als Argument übergeben. Lassen Sie uns alle Tasten auflisten, die mit bar beginnen.

print(r.keys(pattern="bar*"))

Ausgang:

['bar-two', 'bar-one', 'bar', 'bar-three']

Verwenden Sie scan_iter(), um alle Schlüssel in der Redis-Datenbank abzurufen

Bei einer großen Datenbank erlaubt uns scan_iter(), die Daten innerhalb unserer Python-Anwendung besser zu verwalten. Außerdem blockiert die Methode key() den Server und verhindert andere Nutzungsvorgänge, und mit scan_iter() ermöglicht ihre Batch-basierte Operation andere Nutzungsvorgänge.

Obwohl keys() schneller sein könnte, eignet es sich nicht für Systeme, die auf mehreren Anfragen basieren.

Sehen wir es uns jetzt in Aktion an.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )
    for key in r.scan_iter(match="bar*"):
        print(key)
except Exception as e:
    print(e)

Ausgang:

bar-three
bar-one
bar-two
bar

Die Verwendung von try/except hilft bei der Lösung von Verbindungsproblemen, wenn wir versuchen, mit der Datenbank zu arbeiten. Nach der Verbindung mit StrictRedis() verwenden wir das match-Argument, um das gesuchte Schlüsselmuster zu definieren, und durchlaufen das Ergebnis, um den Schlüssel zu erhalten.

Verwenden Sie zip_longest, um alle Schlüssel in der Redis-Datenbank abzurufen

Wie bereits erwähnt, ist für größere Datenbanken mit vielen Schlüsseln die Methode scan_iter() besser, aber wir können sie weiter verbessern, indem wir die Schlüssel in Stapeln einer bestimmten Anzahl abrufen, um das Ergebnis besser zu verwalten.

Um den batch zu erstellen, benötigen wir das Modul itertools, das verschiedene Iteratoren (oder Methoden) bereitstellt, die für verschiedene Fälle verwendet werden können. Innerhalb des itertools-Moduls haben wir die zip_longest Methode, die ein zip_longest-Objekt zurückgibt, dessen .next()-Methode ein Tupel zurückgibt und Elemente aus der ihm übergebenen Iterable aggregiert.

Wir können die Methode zip_longest() verwenden, um eine Funktion zu erstellen, die abhängig von den übergebenen Argumenten einen Stapel einer bestimmten Anzahl von Schlüsseln erstellt. Zum Beispiel erstellen wir einen Stapel von 2, der für viele Fälle verwendet werden kann.

import redis
from itertools import zip_longest

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )

    def batch(iterable, num):
        initIter = [iter(iterable)] * num
        return zip_longest(*initIter)

    for keyBatch in batch(r.scan_iter("bar*"), 2):
        print(keyBatch)
except Exception as e:
    print(e)

Ausgang:

('bar-three', 'bar-one')
('bar-two', 'bar')
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn