Antworten im Handumdrehen
Der Webshop einer Buchhandlung muss bei jedem Klick wissen, wer angemeldet ist. Er soll auch die Besucher zählen und sich die letzten fünf Seiten jeder Person merken.
Eine klassische Datenbank kann das, wird aber langsam, wenn Tausende gleichzeitig klicken. Ein Key-Value-Speicher hält diese kleinen Fakten im Arbeitsspeicher und antwortet in Bruchteilen einer Millisekunde.
Am Ende dieser Lektion
Notiz
Ich kann einen Key-Value-Speicher für die passende Aufgabe auswählen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Key-Value-Speicher | eine Datenbank, die einen Wert unter einem Namen hält | |
| Schlüssel | der Name, unter dem man einen Wert wiederfindet (Key) | sitzung:lea |
| Ablaufzeit | der Zeitpunkt, an dem ein Schlüssel von selbst entfernt wird | |
| Atomar | in einem einzigen Schritt, der sich nicht teilen lässt | |
| Liste | mehrere Werte in Reihenfolge unter einem Schlüssel | |
| Hash | benannte Felder unter einem einzigen Schlüssel |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Key-Value-Speicher gleicht einem Dictionary
Ein Key-Value-Speicher hält einen Wert unter einem Schlüssel und gibt ihn zurück, wenn Sie den Schlüssel nennen. Er gleicht einem Python-Dictionary, liegt aber auf einem Server, den viele Programme teilen.
Valkey ist ein freier Speicher, der alles im Arbeitsspeicher hält. Sie schicken ihm Befehle wie SET oder GET. Jede Antwort beginnt mit einem Zeichen: + für eine kurze Antwort, $ für Text, : für eine Zahl und * für eine Liste von Antworten.
Beispiel: Antworten lesen
| Sie senden | Antwort | Das bedeutet |
|---|---|---|
| SET bestand:tasse 40 | +OK | Gespeichert |
| GET bestand:tasse | $2, dann 40 | Ein Text der Länge 2, er lautet 40 |
| INCR besuche | :1 | Eine Zahl, der neue Wert |
| GET kein-schluessel | $-1 | Es gibt nichts |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einen kleinen Client namens v bauen
v() ( printf '%s\r\n' "$*" | nc -w 1 valkey 6379 )Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Bestand an Tassen speichern
v SET bestand:tasse 40Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihn erneut abfragen
v GET bestand:tasseHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Schlüssel kann von selbst ablaufen
Eine Anmeldesitzung soll nicht ewig dauern. Mit EX 60 lebt ein Schlüssel 60 Sekunden, dann entfernt ihn der Speicher. Sie schreiben keinen Aufräumcode.
TTL fragt, wie viele Sekunden noch bleiben. Ist der Schlüssel weg, antwortet GET mit $-1.
Eine Sitzung für eine Minute speichern
v SET sitzung:lea token123 EX 60Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die verbleibende Zeit abfragen
v TTL sitzung:leaHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Schlüssel abfragen, den es nicht gibt
v GET sitzung:fehltHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Wann hört ein Schlüssel auf zu existieren?
# Ein Schlüssel mit Ablauf ist ein Wert und der Zeitpunkt, an dem er verschwindet.
eintrag = ["token123", 1060]
for jetzt in [1000, 1059, 1060, 1100]:
if jetzt < eintrag[1]:
print(jetzt, "noch da:", eintrag[0])
else:
print(jetzt, "abgelaufen")
# Ersetzen Sie 1060 durch 1090 und starten Sie erneut.
Zähler und Listen erledigen die Arbeit
INCR addiert 1 zu einer Zahl und liefert den neuen Wert. Das ist atomar: Tausend gleichzeitige Besucher werden alle gezählt. Getrenntes Lesen, Addieren und Schreiben könnte welche verlieren.
Eine Liste hält Werte in Reihenfolge unter einem Schlüssel. RPUSH hängt hinten an, LLEN liefert die Länge. Ein Hash hält benannte Felder, etwa ein Profil.
Besuche von Hand zählen
# Seitenaufrufe in einem Dictionary zählen: lesen, addieren, schreiben.
besuche = {}
for seite in ["start", "warenkorb", "start", "start"]:
if seite in besuche:
besuche[seite] = besuche[seite] + 1
else:
besuche[seite] = 1
print(besuche)
# Ein Key-Value-Speicher macht dieses Addieren in einem Schritt: Mehrere Schreibende stören sich nicht.
Einen Besuch der Startseite zählen
v INCR besuche:startHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Drei Seitenaufrufe von Lea notieren
v RPUSH zuletzt:lea start warenkorb kasseHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Fragen, welche Art Wert gespeichert ist
v TYPE zuletzt:leaHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Felder von Leas Profil speichern
v HSET kunde:lea name Lea stadt LeipzigHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Alle Felder wieder lesen
v HGETALL kunde:leaHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Key-Value-Speicher sei ein sicherer Ort für alle Daten. Der Arbeitsspeicher ist begrenzt, und ein Schlüssel kann ablaufen. Halten Sie den Stammsatz in einer Datenbank. Nutzen Sie den Speicher für schnelle, kurzlebige Fakten.
Weiterführend: fünf Versuche pro Minute
Eine Anmeldeseite erlaubt jeder Person fünf Versuche pro Minute. Bauen Sie diese Grenze aus INCR auf einem Schlüssel wie versuche:bo und aus EXPIRE versuche:bo 60, das einem vorhandenen Schlüssel eine Ablaufzeit gibt.
Führen Sie Ihre Befehle sechsmal aus. Notieren Sie die sechste Antwort und was die Seite damit tun soll.