In diesem Kapitel stellen wir vor, wie man redis in Python bedient. redis ist eine Key-Value-Datenbank. Der Wert unterstützt string, list, set, zset (geordnetes Set), hash (Hash-Typ) und andere Typen.
Weitere Informationen zu redis finden Sie in unseremredis-Tutorial. Beachten Sie, dass Sie vor dem Lernen dieses Kapitels sicherstellen müssen, dass Ihr redis-Dienst installiert wurde.
Die redis-Startoberfläche sieht wie folgt aus:
redis starten
75858:C 25 Okt 11:43:34.329 # Warnung: Keine Konfigurationsdatei angegeben, es wird die Standardkonfiguration verwendet. Um eine Konfigurationsdatei anzugeben, verwenden Sie ./redis-server /path/to/redis.conf
75858:M 25 Okt 11:43:34.331 * Maximale Anzahl offener Dateien erhöht auf 10032 (sie war ursprünglich setze auf 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.3 (255fcb1a/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Läuft im Standalone-Modus
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 75858
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
75858:M 25 Okt 11:43:34.337 # Server gestartet, Redis Version 3.0.3
75858:M 25 Okt 11:43:34.339 * DB von Datenträger geladen: 0.002 Sekunden
75858:M 25 Okt 11:43:34.339 * Der Server ist jetzt bereit, Verbindungen auf Port anzunehmen 6379
Sie können sehen, die Standard-Portnummer ist6379。
redis-Modul installieren
Um redis in Python zu verwenden, müssen Sie zuerst das redis-Modul installieren:
sudo pip3 install redis oder sudo easy_install redis oder sudo python setup.py install
Quellcode-Adresse:https://github.com/WoLpH/redis-py
Prüfen Sie, ob die Installation erfolgreich ist:
>>> import redis
>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
'bar'
redis bietet zwei Klassen: Redis und StrictRedis. StrictRedis wird verwendet, um die meisten offiziellen Befehle zu implementieren, und Redis ist eine Unterklasse von StrictRedis, die für die Abwärtskompatibilität mit alten Versionen verwendet wird.
Das von Redis abgerufene Ergebnis ist standardmäßig Bytes; wir könnendecode_responses=Truesetzen, um es in einen String umzuwandeln.
Beispiel
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'example') # Setzt den Wert, der name entspricht
print(r['name'])
print(r.get('name')) # Den Wert für den Schlüssel name abrufen
print(type(r.get('name'))) # Den Typ prüfen
Das Ausgabeergebnis ist:
example example <class 'str'>
Verbindungspool
redis-py verwendet einen Verbindungspool, um alle Verbindungen zu einem Redis-Server zu verwalten, wodurch der Overhead für das Aufbauen und Freigeben von Verbindungen bei jedem Vorgang vermieden wird.
Standardmäßig verwaltet jede Redis-Instanz ihren eigenen Verbindungspool. Sie können direkt einen Verbindungspool erstellen und ihn dann als Parameter an Redis übergeben, sodass mehrere Redis-Instanzen einen Verbindungspool gemeinsam nutzen können.
Beispiel
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'example') # Setzt den Wert, der name entspricht
print(r.get('name')) # Den Wert für den Schlüssel name abrufen
Redis-Grundbefehle String
set(name, value, ex=None, px=None, nx=False, xx=False)
Setzt einen Wert in Redis. Standardmäßig wird er erstellt, falls er nicht existiert; falls er existiert, wird er geändert.
Parameter:
- ex - Ablaufzeit (Sekunden)
- px - Ablaufzeit (Millisekunden)
- nx - Wenn auf True gesetzt, wird die aktuelle set-Operation nur ausgeführt, wenn name nicht existiert.
- xx - Wenn auf True gesetzt, wird die aktuelle set-Operation nur ausgeführt, wenn name existiert.
1. ex - Ablaufzeit (Sekunden). Hier ist die Ablaufzeit 3 Sekunden. Nach 3 Sekunden wird der Wert des Schlüssels food zu None.
Beispiel
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3) # Der Schlüssel ist "food" und der Wert ist "mutton". Speichern Sie das Schlüssel-Wert-Paar im Redis-Cache.
print(r.get('food')) # mutton. Ruft den Wert ab, der dem Schlüssel food entspricht.
2. px - Ablaufzeit (Millisekunden). Hier ist die Ablaufzeit 3 Millisekunden. Nach 3 Millisekunden wird der Wert des Schlüssels foo zu None.
Beispiel
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)
print(r.get('food'))
3. nx - Wenn auf True gesetzt, wird die aktuelle set-Operation nur ausgeführt, wenn name nicht existiert (erstellen).
Beispiel
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.set('fruit', 'watermelon', nx=True)) # True--existiert nicht
# Wenn der Schlüssel fruit nicht existiert, ist die Ausgabe True; wenn der Schlüssel fruit bereits existiert, ist die Ausgabe None.
4. xx - Wenn auf True gesetzt, wird die aktuelle set-Operation nur ausgeführt, wenn name existiert (ändern).
Beispiel
# Wenn der Schlüssel fruit bereits existiert, ist die Ausgabe True; wenn der Schlüssel fruit nicht existiert, ist die Ausgabe None.
5.setnx(name, value)
Setzt einen Wert; führt die set-Operation nur aus, wenn name nicht existiert (hinzufügen).
print(r.setnx('fruit1', 'banana')) # fruit1不存在,输出为True
6.setex(name, time, value)
Wert setzen
Parameter:
time - Ablaufzeit (numerische Sekunden oder timedelta-Objekt)
Beispiel
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", 5, "orange")
time.sleep(5)
print(r.get('fruit2')) # Nach 5 Sekunden ändert sich der Wert von orange zu None.
7.psetex(name, time_ms, value)
Wert setzen
Parameter:
time_ms - Ablaufzeit (numerische Millisekunden oder timedelta-Objekt)
Beispiel
time.sleep(5)
print(r.get('fruit3')) # Nach 5000 Millisekunden ändert sich der Wert von apple zu None.
8.mset(*args, **kwargs)
Werte stapelweise setzen
Zum Beispiel:
Beispiel
r.mset(k1="v1", k2="v2") # Hier dürfen k1 und k2 nicht in Anführungszeichen gesetzt werden; mehrere Schlüssel-Wert-Paare auf einmal setzen.
print(r.mget("k1", "k2")) # Die Werte abrufen, die mehreren Schlüsseln auf einmal entsprechen.
print(r.mget("k1"))
9.mget(keys, *args)
Stapelabruf
Zum Beispiel:
Beispiel
print(r.mget(['k1', 'k2']))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2")) # Die Werte, die den Schlüsseln im aktuellen Redis-Cache entsprechen, stapelweise abrufen.
10.getset(name, value)
Einen neuen Wert setzen und den ursprünglichen Wert abrufen
print(r.getset("food", "barbecue")) # 设置的新值是barbecue 设置前的值是beef
11.getrange(key, start, end)
Teilsequenz abrufen (nach Bytes abrufen, nicht nach Zeichen)
Parameter:
- name - der Name von Redis
- start - Startposition (Byte)
- end - Endposition (Byte)
Zum Beispiel: "君惜大大", 0-3 bedeutet "君"
Beispiel
print(r.getrange("cn_name", 0, 2)) # Holt die Bytes bei Index 0-2, die ersten 3 Bytes, "君", Slice-Operation (ein chinesisches Schriftzeichen belegt 3 Bytes, ein Buchstabe belegt 1 Byte, jedes Byte hat 8 Bits)
print(r.getrange("cn_name", 0, -1)) # Holt alle Bytes, "Junxi Dada", Slice-Operation
r.set("en_name","junxi") # Buchstaben
print(r.getrange("en_name", 0, 2)) # Holt die Bytes bei Index 0-2, die ersten 3 Bytes, "jun", Slice-Operation (ein chinesisches Schriftzeichen belegt 3 Bytes, ein Buchstabe belegt 1 Byte, jedes Byte hat 8 Bits)
print(r.getrange("en_name", 0, -1)) # Holt alle Bytes, "junxi", Slice-Operation
12.setrange(name, offset, value)
Ändert den String-Inhalt, ersetzt ab dem angegebenen String-Index (wenn der neue Wert zu lang ist, wird am Ende angehängt).
Parameter:
- offset - Index des Strings, in Bytes (ein chinesisches Schriftzeichen belegt drei Bytes)
- value - Wert, der gesetzt werden soll
Beispiel
print(r.get("en_name")) # jccci ursprünglicher Wert ist junxi, ersetze beginnend bei Index 1 durch ccc, wird zu jccci
13.setbit(name, offset, value)
Operationen an den Bits der Binärdarstellung des zu name gehörenden Werts ausführen
Parameter:
- name - Redis-Name
- offset - Index des Bits (den Wert vor dem Indexieren in Binär umwandeln)
- value - Wert kann nur 1 oder 0 sein
Hinweis: Wenn es einen entsprechenden Eintrag in Redis gibt: n1 = "foo",
dann lautet die Binärdarstellung der Zeichenkette foo: 01100110 01101111 01101111
Wenn also setbit('n1', 7, 1) ausgeführt wird, dann wird das 7. Bit auf 1 gesetzt,
dann lautet die endgültige Binärdarstellung 01100111 01101111 01101111, d. h.: "goo"
Erweiterung, in Binärdarstellung umwandeln:
Beispiel
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')
Insbesondere: Was, wenn source die chinesischen Zeichen "Chen Siwei" ist?
Antwort: Bei utf-8 belegt jedes chinesische Zeichen 3 Bytes, also hat "Chen Siwei" 9 Bytes. Bei chinesischen Zeichen wird bei Verwendung einer for-Schleife byteweise iteriert. Während der Iteration wird jedes Byte in eine Dezimalzahl umgewandelt und dann die Dezimalzahl in eine Binärzahl umgewandelt. 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
14.getbit(name, offset)
Ruft den Wert eines bestimmten Bits (0 oder 1) in der Binärdarstellung des Werts ab, der name entspricht
print(r.getbit("foo1", 0)) # 0 foo1 对应的二进制 4个字节 32位 第0位是0还是1
15.bitcount(key, start=None, end=None)
Ruft die Anzahl der Einsen in der Binärdarstellung des Werts ab, der name entspricht
Parameter:
- key - Redis-Name
- start - Byte-Startposition
- end - Byte-Endposition
Beispiel
print(r.bitcount("foo",0,1)) # 11 gibt die Anzahl der Vorkommen von 1 in den ersten 2 Bytes an
16.bitop(operation, dest, *keys)
Mehrere Werte abrufen, bitweise Operationen an den Werten durchführen und das Endergebnis im Wert speichern, der einem neuen Namen entspricht
Parameter:
- operation - AND (und), OR (oder), NOT (nicht), XOR (exklusives Oder)
- dest - neuer Redis-Name
- *keys - Redis-Namen zum Nachschlagen
e.g.:
bitop("AND", 'new_name', 'n1', 'n2', 'n3')
Die Werte abrufen, die n1, n2, n3 in Redis entsprechen, dann eine bitweise Operation an allen Werten durchführen (Vereinigung bilden) und dann das Ergebnis im Wert speichern, der new_name entspricht
Beispiel
r.set("foo1","2") # 0110010
print(r.mget("foo","foo1")) # ['goo1', 'baaanew']
print(r.bitop("AND","new","foo","foo1")) # "new" 0 0110000
print(r.mget("foo","foo1","new"))
source = "12"
for i in source:
num = ord(i)
print(num) # Gib den ASCII-Code-Wert aus, der jedem Buchstabenzeichen oder chinesischen Zeichen entspricht f-102-0b100111-01100111
print(bin(num)) # Gib jeden dezimalen ASCII-Code-Wert als Binärwert 0b1100110 aus (0b steht für binär)
print bin(num).replace('b','') # Ersetze die Binärzahl 0b1100110 durch 01100110
17.strlen(name)
Gibt die Byte-Länge des Werts zurück, der name entspricht (ein chinesisches Zeichen ist 3 Bytes)
print(r.strlen("foo")) # 4 'goo1'的长度是4
18.incr(self, name, amount=1)
Inkrementiert den Wert, der name entspricht. Wenn name nicht existiert, wird name=amount erstellt, andernfalls wird inkrementiert.
Parameter:
- name - Redis-Name
- amount – Inkrementwert (muss eine Ganzzahl sein)
Hinweis: entspricht incrby
Beispiel
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
r.incr("foo", amount=1)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
Anwendungsszenario – Seitenaufrufzähler
Angenommen, wir müssen die Klickzahlen für eine Reihe von Seiten erfassen. Beispielsweise muss für jeden Beitrag in einem Forum die Klickzahl erfasst werden, und die Klickzahl ist viel größer als die Anzahl der Antworten. Wenn eine relationale Datenbank zum Speichern von Klicks verwendet wird, kann es zu vielen Konflikten durch Sperren auf Zeilenebene kommen. Daher ist die Verwendung des INCR-Befehls von Redis zum Erhöhen der Klickzahl die beste Lösung.
Wenn der Redis-Server startet, kann der Anfangswert der Klickzahl aus der relationalen Datenbank gelesen werden (Seite 12306 wurde 34634-mal aufgerufen)
print(r.get("visit:12306:totals"))
Immer wenn eine Seite angeklickt wird, verwenden Sie INCR, um die Klickzahl zu erhöhen.
r.incr("visit:12306:totals")
Wenn die Seite geladen wird, kann dieser Wert direkt abgerufen werden
print(r.get("visit:12306:totals"))
19.incrbyfloat(self, name, amount=1.0)
Inkrementiert den Wert, der name entspricht. Wenn name nicht existiert, wird name=amount erstellt, andernfalls wird inkrementiert.
Parameter:
- name - Redis-Name
- amount - Inkrementwert (Gleitkommazahl)
Beispiel
r.set("foo2", "221.0")
print(r.mget("foo1", "foo2"))
r.incrbyfloat("foo1", amount=2.0)
r.incrbyfloat("foo2", amount=3.0)
print(r.mget("foo1", "foo2"))
20.decr(self, name, amount=1)
Dekrementiert den Wert, der zu name gehört. Wenn name nicht existiert, lege name=amount an, andernfalls dekrementiere.
Parameter:
- name - Redis-Name
- amount - Dekrementwert (Ganzzahl)
Beispiel
r.decr("foo1", amount=1) # Um 1 dekrementieren
print(r.mget("foo1", "foo4"))
21.append(key, value)
Inhalt an den Wert anhängen, der dem Redis-Namen entspricht
Parameter:
- key - Redis-Name
- value - anzuhängende Zeichenkette
Beispiel
print(r.mget("name"))
Redis-Grundbefehle Hash
1. Einzelnes Hinzufügen/Aktualisieren (einzelnes Abrufen) - hinzufügen, falls nicht vorhanden, ändern, falls vorhanden
hset(name, key, value)
Setzt ein Schlüssel-Wert-Paar im Hash, der name entspricht (falls nicht vorhanden, erstellen; andernfalls ändern)
Parameter:
- name - Redis-Name
- key - Schlüssel im Hash, der name entspricht
- value - Wert im Hash, der name entspricht
Hinweis: hsetnx(name, key, value) legt an, wenn der aktuelle Schlüssel im Hash, der name entspricht, nicht existiert (entspricht dem Hinzufügen)
Beispiel
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # Alle Schlüssel im Hash abrufen
print(r.hget("hash1", "k1")) # Den Wert für den Schlüssel des Hashes einzeln abrufen
print(r.hmget("hash1", "k1", "k2")) # Die Werte für mehrere Schlüssel des Hashes abrufen
r.hsetnx("hash1", "k2", "v3") # Kann nur neue erstellen
print(r.hget("hash1", "k2"))
2. Stapelweises Hinzufügen (Abrufen)
hmset(name, mapping)
Stapelweise Schlüssel-Wert-Paare im Hash setzen, der name entspricht
Parameter:
- name - Redis-Name
- mapping - Wörterbuch, wie z. B.: {'k1':'v1', 'k2': 'v2'}
e.g.:
Beispiel
hget(name,key)
Im Hash, der name entspricht, den Wert anhand des Schlüssels abrufen
hmget(name, keys, *args)
Im Hash, der zu name gehört, die Werte mehrerer Schlüssel abrufen
Parameter:
- name – Name, der zu Redis gehört
- keys – Schlüsselsammlung zum Abrufen, z. B.: ['k1', 'k2', 'k3']
- *args – Schlüssel zum Abrufen, z. B.: k1,k2,k3
e.g.:
Beispiel
print(r.hmget("hash2", "k2", "k3")) # Werte für key-k2 k3 von "hash2" stapelweise abrufen -- Methode 1
print(r.hmget("hash2", ["k2", "k3"])) # Werte für key-k2 k3 von "hash2" stapelweise abrufen -- Methode 2
3. Alle Schlüssel-Wert-Paare abrufen
hgetall(name)
Alle Schlüssel-Werte des Hashes abrufen, der zu name gehört
print(r.hgetall("hash1"))
4. Das Format aller Schlüssel-Wert-Paare abrufen, Hash-Länge
hlen(name)
Die Anzahl der Schlüssel-Wert-Paare im Hash abrufen, der zu name gehört
print(r.hlen("hash1"))
5. Alle Schlüssel abrufen (ähnlich wie das Abrufen aller Schlüssel eines Wörterbuchs)
hkeys(name)
Die Werte aller Schlüssel im Hash mit dem Namen name abrufen
print(r.hkeys("hash1"))
6. Alle Werte abrufen (ähnlich dem Abrufen aller Werte eines Dictionaries)
hvals(name)
Alle Werte im Hash mit dem Namen name abrufen
print(r.hvals("hash1"))
7. Prüfen, ob ein Mitglied existiert (ähnlich dem 'in' eines Dictionaries)
hexists(name, key)
Prüfen, ob der aktuell übergebene Schlüssel im Hash mit dem Namen name existiert
Beispiel
print(r.hexists("hash1", "k1")) # True: existiert
8. Schlüssel-Wert-Paar löschen
hdel(name,*keys)
Das Schlüssel-Wert-Paar des angegebenen Schlüssels im Hash mit dem Namen name löschen
Beispiel
r.hset("hash1", "k2", "v222") # Vorhandenen Schlüssel k2 ändern
r.hset("hash1", "k11", "v1") # Neues Schlüssel-Wert-Paar k11 hinzufügen
r.hdel("hash1", "k1") # Ein Schlüssel-Wert-Paar löschen
print(r.hgetall("hash1"))
9. Integer inkrementieren/dekrementieren (für den Wert, der dem key entspricht, Integer, um 1 oder 2 oder einen anderen Integer erhöhen; negativ bedeutet dekrementieren)
hincrby(name, key, amount=1)
Inkrementieren Sie den Wert des angegebenen Schlüssels im Hash für name; falls dieser nicht existiert, legen Sie key=amount an
Parameter:
- name - Name in Redis
- key - Schlüssel, der dem Hash entspricht
- amount - Auto-Inkrement-Zahl (Integer)
Beispiel
r.hincrby("hash1", "k3", amount=-1)
print(r.hgetall("hash1"))
r.hincrby("hash1", "k4", amount=1) # Falls er nicht existiert, ist der Wert standardmäßig 1
print(r.hgetall("hash1"))
10. Float inkrementieren/dekrementieren (für den Wert, der dem key entspricht, Float, um 1.0 oder 2.0 oder einen anderen Float erhöhen; negativ bedeutet dekrementieren)
hincrbyfloat(name, key, amount=1.0)
Inkrementieren Sie den Wert des angegebenen Schlüssels im Hash für name; falls dieser nicht existiert, legen Sie key=amount an
Parameter:
- name - der Name in Redis
- key - der Schlüssel, der dem Hash entspricht
- amount, automatisch inkrementierende Zahl (float)
Inkrementiere den Wert des angegebenen Schlüssels im Hash, der name entspricht; wenn er nicht existiert, erstelle key=amount.
Beispiel
r.hincrbyfloat("hash1", "k5", amount=-1.0) # Existiert bereits, um -1.0 verringern
print(r.hgetall("hash1"))
r.hincrbyfloat("hash1", "k6", amount=-1.0) # Existiert nicht, Wert initialisiert sich auf -1.0, jedes Mal um 1.0 verringern
print(r.hgetall("hash1"))
11. Wert abrufen - Slice-Lesen
hscan(name, cursor=0, match=None, count=None)
Inkrementelles iteratives Abrufen ist sehr nützlich für große Datenmengen. hscan kann Daten in Shards abrufen, anstatt alle Daten auf einmal abzurufen, wodurch verhindert wird, dass der Speicher erschöpft wird.
Parameter:
- name - der Name in Redis
- cursor - Cursor (Daten in Batches basierend auf dem Cursor abrufen)
- match - den angegebenen Schlüssel abgleichen, Standard None bedeutet alle Schlüssel
- count - minimale Anzahl, die pro Shard abgerufen wird, Standard None bedeutet, die Standard-Shard-Anzahl von Redis zu verwenden
Zum Beispiel:
第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
...
Bis der zurückgegebene Cursor-Wert 0 ist, bedeutet es, dass alle Daten per Sharding abgerufen wurden
print(r.hscan("hash1"))
12, hscan_iter(name, match=None, count=None)
Verwende yield, um hscan zu umschließen und einen Generator zu erzeugen, der das Abrufen von Daten aus Redis in Batches ermöglicht
Parameter:
- match - den angegebenen Schlüssel abgleichen, Standard None bedeutet alle Schlüssel
- count - minimale Anzahl, die pro Shard abgerufen wird, Standard None bedeutet, die Standard-Shard-Anzahl von Redis zu verwenden
Zum Beispiel:
Beispiel
print(item)
print(r.hscan_iter("hash1")) # Speicheradresse des Generators
5. Liste der grundlegenden Redis-Befehle
1. Hinzufügen (ähnlich wie list append, aber hier wird von links hinzugefügt) -- erstellt eine neue, falls sie nicht existiert
lpush(name,values)
Fügt ein Element zur Liste hinzu, die name entspricht; jedes neue Element wird ganz links an die Liste angehängt
Zum Beispiel:
Beispiel
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.lpush("list1", 11, 22, 33)
print(r.lrange('list1', 0, -1))
Die gespeicherte Reihenfolge ist: 33, 22, 11
Erweiterung:
r.rpush("list2", 11, 22, 33) # 表示从右向左操作
print(r.llen("list2")) # 列表长度
print(r.lrange("list2", 0, 3)) # 切片取出值,范围是索引号0-3
2. Hinzufügen (von rechts hinzufügen) -- erstellt eine neue, falls sie nicht existiert
Beispiel
print(r.llen("list2")) # Listenlänge
print(r.lrange("list2", 0, -1)) # Slicing, um Werte zu erhalten, Bereich ist Index 0 bis -1 (das letzte Element)
3. Füge für einen existierenden Namen ein Element auf der linken Seite der Liste hinzu; wenn er nicht existiert, kann er nicht erstellt werden
lpushx(name,value)
Füge ein Element zur Liste hinzu, die dem Namen entspricht; nur wenn der Name bereits existiert, wird der Wert ganz links zur Liste hinzugefügt
Mehr:
Beispiel
print(r.llen("list10")) # 0
print(r.lrange("list10", 0, -1)) # []
r.lpushx("list2", 77) # Hier existierte "list2" bereits zuvor, füge ein Element ganz links an die Liste an, nur eines auf einmal
print(r.llen("list2")) # Listenlänge
print(r.lrange("list2", 0, -1)) # Slicing, um Werte zu erhalten, Bereich ist Index 0 bis -1 (das letzte Element
4. Füge für einen existierenden Namen ein Element auf der rechten Seite der Liste hinzu; wenn er nicht existiert, kann er nicht erstellt werden
Beispiel
print(r.llen("list2")) # Listenlänge
print(r.lrange("list2", 0, -1)) # Slicing, um Werte zu erhalten, Bereich ist Index 0 bis -1 (das letzte Element)
5. Hinzufügen (Element an einer festen Indexposition einfügen)
linsert(name, where, refvalue, value))
Füge einen neuen Wert vor oder nach einem bestimmten Wert in der Liste ein, die name entspricht
Parameter:
- name - der Name in Redis
- where - BEFORE oder AFTER
- refvalue - Referenzwert, d. h. Daten davor oder danach einfügen
- value - einzufügende Daten
Beispiel
print(r.lrange("list2", 0, -1)) # Ausschnitt, um Werte zu erhalten, Bereich ist Index 0 - letztes Element
6. Ändern (durch Angabe des Index ändern)
r.lset(name, index, value)
Weise einen Wert an einer bestimmten Indexposition in der Liste neu zu, die name entspricht
Parameter:
- name - der Name in Redis
- index - Indexposition in der Liste
- value - Wert, der gesetzt werden soll
Beispiel
print(r.lrange("list2", 0, -1))
7. Löschen (Löschen nach angegebenem Wert)
r.lrem(name, value, num)
Den angegebenen Wert in der Liste, die name entspricht, löschen
Parameter:
- name - der Name in Redis
- value - zu löschender Wert
- num - num=0, alle angegebenen Werte in der Liste löschen;
- num=2 - 2 von vorne nach hinten löschen; num=1, das erste von links von vorne nach hinten löschen
- num=-2 - 2 von hinten nach vorne löschen
Beispiel
print(r.lrange("list2", 0, -1))
r.lrem("list2", "99", -1) # Das erste Vorkommen von "99" von rechts in der Liste löschen
print(r.lrange("list2", 0, -1))
r.lrem("list2", "22", 0) # Alle "22" in der Liste löschen
print(r.lrange("list2", 0, -1))
8. Löschen und zurückgeben
lpop(name)
Das erste Element von der linken Seite der Liste, die name entspricht, abrufen und es aus der Liste entfernen; der Rückgabewert ist das erste Element
Mehr:
rpop(name) bedeutet von rechts nach links zu arbeiten
Beispiel
print(r.lrange("list2", 0, -1))
r.rpop("list2") # Lösche das rechteste Element der Liste und gib das gelöschte Element zurück
print(r.lrange("list2", 0, -1))
9. Werte außerhalb des Indexbereichs löschen
ltrim(name, start, end)
In der Liste, die name entspricht, Werte entfernen, die nicht zwischen den start-end-Indizes liegen
Parameter:
- name - der Name in Redis
- start - Startindexposition
- end - Endindexposition
Beispiel
print(r.lrange("list2", 0, -1))
10. Wert abrufen (Wert anhand des Index abrufen)
lindex(name, index)
Das Listenelement anhand des Index in der Liste abrufen, die name entspricht
print(r.lindex("list2", 0)) # 取出索引号是0的值
11. Ein Element von einer Liste in eine andere Liste verschieben
rpoplpush(src, dst)
Das rechteste Element aus einer Liste nehmen und es ganz links an eine andere Liste anhängen
Parameter:
- src - der Name der Liste, aus der Daten entnommen werden
- dst - der Name der Liste, zu der Daten hinzugefügt werden sollen
r.rpoplpush("list1", "list2")
print(r.lrange("list2", 0, -1))
12. Verschiebe ein Element von einer Liste in eine andere Liste, mit Timeout-Unterstützung
brpoplpush(src, dst, timeout=0)
Entferne ein Element von der rechten Seite einer Liste und füge es zur linken Seite einer anderen Liste hinzu
Parameter:
- src - der Name der Liste, aus der das Element entnommen und entfernt wird
- dst - der Name der Liste, in die das Element eingefügt wird
- timeout - wenn in der Liste, die src entspricht, keine Daten vorhanden sind, die Timeout-Dauer (Sekunden) für das Blockieren, bis Daten verfügbar sind; 0 bedeutet unendlich blockieren
Beispiel
print(r.lrange("list2", 0, -1))
13. Entferne gleichzeitig aus mehreren Listen
blpop(keys, timeout)
Ordne mehrere Listen an und entnehme Elemente aus den entsprechenden Listen von links nach rechts
Parameter:
- keys - eine Sammlung von Redis-Namen
- timeout - Timeout-Zeitraum; nach dem Abrufen von Elementen aus allen Listen die Zeit (Sekunden) für das blockierende Warten auf Daten in der Liste; 0 bedeutet unendlich blockieren
Mehr:
r.brpop(keys, timeout)Wie blpop, mehrere Listen anordnen und Elemente aus jeder Liste von rechts nach links entfernen
Beispiel
r.lpush("list11", 3, 4, 5)
while True:
r.blpop(["list10", "list11"], timeout=2)
print(r.lrange("list10", 0, -1), r.lrange("list11", 0, -1))
14. Benutzerdefinierte inkrementelle Iteration
Da die redis-Bibliothek keine inkrementelle Iteration für Listenelemente bereitstellt, müssen Sie, wenn Sie über alle Elemente der Liste iterieren möchten, die name entspricht, die gesamte Liste abrufen, die name entspricht.
Die Liste durchlaufen
Wenn die Liste jedoch sehr groß ist, kann sie im ersten Schritt den Speicher des Programms erschöpfen, daher ist es notwendig, eine benutzerdefinierte inkrementelle Iterationsfunktion zu definieren:
Beispiel
"""
Benutzerdefinierte inkrementelle Iteration für Redis-Listen
:param name: der Name in Redis, d. h. über die Liste iterieren, die name entspricht
:return: yield gibt Listenelemente zurück
"""
list_count = r.llen(name)
for index in range(list_count):
yield r.lindex(name, index)
# Verwendung
for item in list_iter('list2'): # Diese Liste durchlaufen
print(item)
6. Redis-Grundbefehle Set
1. Hinzufügen
sadd(name,values)
name - Elemente zum entsprechenden Set hinzufügen
Beispiel
print(r.scard("set1")) # Die Länge des Sets ist 4
print(r.smembers("set1")) # Alle Mitglieder im Set abrufen
2. Anzahl der Elemente abrufen, ähnlich wie len
scard(name)
Anzahl der Elemente im Set abrufen, das name entspricht
print(r.scard("set1")) # 集合的长度是4
3. Alle Mitglieder der Menge abrufen
smembers(name)
Alle Mitglieder der Menge abrufen, die dem Namen entspricht
print(r.smembers("set1")) # 获取集合中所有的成员
Alle Mitglieder der Menge abrufen - in Tupelform
sscan(name, cursor=0, match=None, count=None)
Beispiel:
print(r.sscan("set1"))
Alle Mitglieder der Menge abrufen - Iteratormethode
sscan_iter(name, match=None, count=None)
Ähnlich wie String-Operationen, verwendet für inkrementelle Iteration, um Elemente in Batches abzurufen, wodurch übermäßiger Speicherverbrauch vermieden wird
for i in r.sscan_iter("set1"):
print(i)
4. Differenz
sdiff(keys, *args)
Die Menge der Elemente, die in der Menge enthalten sind, die dem ersten Namen entspricht, aber nicht in den Mengen, die den anderen Namen entsprechen
Beispiel
print(r.smembers("set1")) # Alle Mitglieder im Set abrufen
print(r.smembers("set2"))
print(r.sdiff("set1", "set2")) # In set1, aber nicht in set2
print(r.sdiff("set2", "set1")) # In set2, aber nicht in set1
5. Differenz - die Differenz in einer neuen Menge speichern
sdiffstore(dest, keys, *args)
Ruft Elemente in der Menge ab, die dem ersten Namen entspricht, aber nicht in Mengen, die anderen Namen entsprechen, und fügt sie dann der Menge hinzu, die dest entspricht
Beispiel
print(r.smembers("set3")) # Alle Mitglieder in set3 abrufen
6. Schnittmenge
sinter(keys, *args)
Ruft die Schnittmenge der Mengen ab, die mehreren Namen entsprechen
print(r.sinter("set1", "set2")) # 取2个集合的交集
7. Schnittmenge - die Schnittmenge in einer neuen Menge speichern
sinterstore(dest, keys, *args)
Ruft die Vereinigung der Mengen ab, die mehreren Namen entsprechen, und fügt sie dann der Menge hinzu, die dest entspricht
print(r.sinterstore("set3", "set1", "set2")) # 取2个集合的交集
print(r.smembers("set3"))
Vereinigung
sunion(keys, *args)
Ruft die Vereinigung der Mengen ab, die mehreren Namen entsprechen
print(r.sunion("set1", "set2")) # 取2个集合的并集
Vereinigung - die Vereinigung in einer neuen Menge speichern
sunionstore(dest,keys, *args)
Ruft die Vereinigung der Mengen ab, die mehreren Namen entsprechen, und speichert das Ergebnis in der Menge, die dest entspricht
print(r.sunionstore("set3", "set1", "set2")) # 取2个集合的并集
print(r.smembers("set3"))
8. Prüfen, ob es ein Mitglied der Menge ist, ähnlich wie "in"
sismember(name, value)
Prüft, ob value ein Mitglied der Menge ist, die name entspricht; das Ergebnis ist True oder False
print(r.sismember("set1", 33)) # 33是集合的成员
print(r.sismember("set1", 23)) # 23不是集合的成员
9. Verschieben
smove(src, dst, value)
Ein Element von einer Menge in eine andere Menge verschieben
r.smove("set1", "set2", 44)
print(r.smembers("set1"))
print(r.smembers("set2"))
10. Löschen - zufällig löschen und den gelöschten Wert zurückgeben
spop(name)
Ein Element aus der Menge entfernen und zurückgeben. Hinweis: Die Menge ist ungeordnet, daher wird es zufällig gelöscht.
print(r.spop("set2")) # 这个删除的值是随机删除的,集合是无序的
print(r.smembers("set2"))
11. Löschen - nach angegebenem Wert löschen
srem(name, values)
Bestimmte Werte aus der Menge löschen, die name entspricht
print(r.srem("set2", 11)) # 从集合中删除指定值 11
print(r.smembers("set2"))
7. Redis-Grundbefehle für geordnete Mengen
Mengenoperationen: Eine Menge ist eine Liste, die keine Duplikate zulässt und von Natur aus ungeordnet ist.
Geordnete Menge: Basierend auf einer Menge wird jedes Element sortiert; zum Sortieren ist ein Vergleich anhand eines anderen Werts erforderlich. Daher hat jedes Element einer geordneten Menge zwei Werte: Wert und Score. Der Score wird speziell zum Sortieren verwendet.
1. Hinzufügen
zadd(name, *args, **kwargs)
Elemente zur geordneten Menge entsprechend name hinzufügen
Zum Beispiel:
Beispiel
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.zadd("zset1", n1=11, n2=22)
r.zadd("zset2", 'm1', 22, 'm2', 44)
print(r.zcard("zset1")) # Länge des Sets
print(r.zcard("zset2")) # Länge des Sets
print(r.zrange("zset1", 0, -1)) # Alle Elemente in der geordneten Menge abrufen
print(r.zrange("zset2", 0, -1, withscores=True)) # Alle Elemente und Scores in der geordneten Menge abrufen
2. Anzahl der Elemente in der geordneten Menge abrufen, ähnlich wie len
zcard(name)
Anzahl der Elemente in der name entsprechenden geordneten Menge abrufen
print(r.zcard("zset1")) # 集合长度
3. Alle Elemente der geordneten Menge abrufen
r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
Elemente der name entsprechenden geordneten Menge nach Indexbereich abrufen
Parameter:
- name - der Name in Redis
- start - Startposition des Index der geordneten Menge (nicht Score)
- end - Endposition des Index der geordneten Menge (nicht Score)
- desc - Sortierregel, standardmäßig nach Score von niedrig nach hoch sortiert
- withscores - ob der Score des Elements abgerufen werden soll; standardmäßig wird nur der Wert des Elements abgerufen
- score_cast_func - Funktion zur Datenkonvertierung des Scores
3-1 In absteigender Reihenfolge sortieren (wie bei zrange wird das Set in absteigender Reihenfolge sortiert)
zrevrange(name, start, end, withscores=False, score_cast_func=float)
Beispiel
print(r.zrevrange("zset1", 0, -1)) # 只获取元素,不显示分数
print(r.zrevrange("zset1", 0, -1, withscores=True)) # 获取有序集合中所有元素和分数,分数倒序
3-2 Elemente des zu name gehörenden sortierten Sets nach Score-Bereich abrufen
zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
Beispiel
Beispiel
element = 'n' + str(i)
r.zadd("zset3", element, i)
print(r.zrangebyscore("zset3", 15, 25)) # # Elemente abrufen, die die Bedingung mit Scores zwischen 15-25 erfüllen
print(r.zrangebyscore("zset3", 12, 22, withscores=True)) # Elemente abrufen, die die Bedingung mit Scores zwischen 12-22 erfüllen (mit Scores)
3-3 Elemente des sortierten Sets nach Score-Bereich abrufen und sortieren (standardmäßig absteigend)
zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
Beispiel
print(r.zrevrangebyscore("zset3", 22, 11, withscores=True)) # 在分数是22-11之间,取出符合条件的元素 按照Scores in umgekehrter Reihenfolge3-4 Alle Elemente abrufen - standardmäßig nach Score-Reihenfolge sortiert
zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
Beispiel
print(r.zscan("zset3"))
3-5 Alle Elemente abrufen - Iterator
zscan_iter(name, match=None, count=None,score_cast_func=float)
Beispiel
for i in r.zscan_iter("zset3"): # 遍历迭代器
print(i)
4.zcount(name, min, max)
Gibt die Anzahl der Scores in der sortierten Menge zurück, die name entspricht, die zwischen [min, max] liegen
print(r.zrange("zset3", 0, -1, withscores=True))
print(r.zcount("zset3", 11, 22))
5. Inkrementieren
zincrby(name, value, amount)
Inkrementiert den Score, der value in der sortierten Menge entspricht, die name entspricht
r.zincrby("zset3", "n2", amount=2) # 每次将n2的分数自增2
print(r.zrange("zset3", 0, -1, withscores=True))
6. Den Index eines Werts abrufen
zrank(name, value)
Den Index eines bestimmten Werts in der sortierten Menge abrufen, die name entspricht (beginnend bei 0)
Mehr:
zrevrank(name, value), sortiert vom größten zum kleinsten.
Beispiel
print(r.zrank("zset3", "n6")) # Der Index von n6 ist 1
print(r.zrevrank("zset3", "n1")) # Der Index von n1 ist 29, hier in umgekehrter Score-Reihenfolge (von groß nach klein)
7. Löschen – nach angegebenem Wert löschen
zrem(name, values)
Löscht Mitglieder, deren Wert einer der Werte in der sortierten Menge ist, die name entspricht
r.zrem("zset3", "n3") # 删除有序集合中的元素n3 删除单个
print(r.zrange("zset3", 0, -1))
8. Löschen – nach Rangbereich löschen, gemäß Indexnummer
zremrangebyrank(name, min, max)
Nach Rangbereich löschen
r.zremrangebyrank("zset3", 0, 1) # 删除有序集合中的索引号是0, 1的元素
print(r.zrange("zset3", 0, -1))
9. Löschen – nach Score-Bereich löschen
zremrangebyscore(name, min, max)
Nach Score-Bereich löschen
r.zremrangebyscore("zset3", 11, 22) # 删除有序集合中的分数是11-22的元素
print(r.zrange("zset3", 0, -1))
10. Den Score abrufen, der einem Wert entspricht
zscore(name, value)
Den Score abrufen, der dem Wert in der sortierten Menge entspricht, die name zugeordnet ist
print(r.zscore("zset3", "n27")) # 获取元素n27对应的分数27
8. Weitere gängige Operationen
1. Löschen
delete(*names)
Beliebigen Datentyp in Redis anhand des Namens löschen (string, hash, list, set, sorted set)
r.delete("gender") # 删除key为gender的键值对
2. Prüfen, ob ein Name existiert
exists(name)
Prüfen, ob der Name in Redis existiert; True, wenn er existiert, False, wenn nicht
print(r.exists("zset1"))
3. Fuzzy-Matching
keys(pattern='')
Redis-Namen nach einem Muster abrufen
Mehr:
- KEYS * entspricht allen Schlüsseln in der Datenbank.
- KEYS h?llo entspricht hello, hallo, hxllo usw.
- KEYS hllo entspricht hllo und heeeeello usw.
- KEYS h[ae]llo entspricht hello und hallo, aber nicht hillo
print(r.keys("foo*"))
4. Timeout setzen
expire(name ,time)
Ein Timeout für einen Namen in Redis setzen
r.lpush("list5", 11, 22)
r.expire("list5", time=3)
print(r.lrange("list5", 0, -1))
time.sleep(3)
print(r.lrange("list5", 0, -1))
5. Umbenennen
rename(src, dst)
Einen Namen in Redis umbenennen
r.lpush("list5", 11, 22)
r.rename("list5", "list5-1")
6. Einen zufälligen Namen abrufen
randomkey()
Einen zufälligen Namen aus redis abrufen (ohne Löschen)
print(r.randomkey())
7. Typ abrufen
type(name)
Den Typ des Werts abrufen, der name entspricht
print(r.type("set1"))
print(r.type("hash2"))
8. Alle Elemente anzeigen
Beispiel
print(r.hscan("hash2"))
print(r.sscan("set3"))
print(r.zscan("zset2"))
print(r.getrange("foo1", 0, -1))
print(r.lrange("list2", 0, -1))
print(r.smembers("set3"))
print(r.zrange("zset3", 0, -1))
print(r.hgetall("hash1"))
9. Alle Elemente anzeigen - Iterator
Beispiel
for i in r.hscan_iter("hash1"):
print(i)
for i in r.sscan_iter("set3"):
print(i)
for i in r.zscan_iter("zset3"):
print(i)
andere Methoden
Beispiel
r.delete("gender") # Das Schlüssel-Wert-Paar mit Schlüssel gender löschen
print(r.keys()) # Alle Schlüssel abfragen
print(r.dbsize()) # Wie viele Datensätze das aktuelle Redis enthält
r.save() # Führt die "checkpoint"-Operation aus, um Daten auf die Festplatte zurückzuschreiben. Blockiert während des Speicherns.
# r.flushdb() # Alle Daten in r löschen
Pipeline (pipeline)
Standardmäßig erstellt redis für jede Anfrage eine Verbindung und trennt sie wieder (es wird eine Verbindung aus dem Verbindungspool angefordert und an den Pool zurückgegeben). Wenn Sie mehrere Befehle in einer Anfrage angeben möchten, können Sie pipeline verwenden, um mehrere Befehle in einer Anfrage auszuführen, und standardmäßig ist eine pipeline eine atomare Operation.
Pipeline ist eine Unterklasse der Basisklasse, die redis zum Puffern mehrerer Serverbefehle in einer einzigen Anfrage bereitstellt. Sie verbessert die Funktionalität zum Ausführen von Batch-Befehlen erheblich, indem sie wiederholte TCP-Pakete zwischen Server und Client reduziert.
Beispiel
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False) # Standardmäßig gewährleisten Befehle, die in der pipeline ausgeführt werden, Atomarität; das Ausführen von pipe = r.pipeline(transaction=False) deaktiviert diese Funktion.
# pipe = r.pipeline(transaction=True)
pipe = r.pipeline() # Eine Pipeline erstellen
pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num') # Wenn num nicht existiert, ist der Wert 1; falls es existiert, wird der Wert um 1 erhöht
pipe.execute()
print(r.get("name"))
print(r.get("role"))
print(r.get("num"))
Pipeline-Befehle können zusammen geschrieben werden, zum Beispiel:
Beispiel
print(r.get("name"))
print(r.get("role"))
print(r.get("num"))
Autor: Junxi丶