Holen Sie sich alle Schlüssel in der Redis-Datenbank mit Python
-
Verwenden Sie
keys()
, um alle Schlüssel in der Redis-Datenbank abzurufen -
Verwenden Sie
scan_iter()
, um alle Schlüssel in der Redis-Datenbank abzurufen -
Verwenden Sie
zip_longest
, um alle Schlüssel in der Redis-Datenbank abzurufen
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.
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 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