In diesem Artikel werden einige Redis-Interviewfragen mit Ihnen geteilt, damit Sie nach Lücken suchen und Ihr Wissen verbessern können. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Cache
Gemeinsame Sitzung
Nachrichtenwarteschlangensystem
Verteilte Sperre
Verwandte Empfehlung: Redis-Video-Tutorial
Reiner Speicherbetrieb
Einzelthread-Betrieb, der häufige Kontextwechsel vermeidet
Angemessene und effiziente Datenstruktur
Verwendung eines nicht blockierenden E/A-Multiplexmechanismus (eine Datei). Der Deskriptor überwacht mehrere Dateideskriptoren gleichzeitig auf Dateneingang.) sind vom String-Typ, und mehrere andere Datenstrukturen basieren auf dem String-Typ. Der häufig verwendete Befehl zum Festlegen des Schlüsselwerts ist String. Wird häufig beim Caching, Zählen, bei gemeinsam genutzten Sitzungen, bei der Ratenbegrenzung usw. verwendet.
Strategie zum verzögerten Löschen: Wenn Sie den Schlüssel erhalten, stellen Sie zunächst fest, ob der Schlüssel abgelaufen ist, und löschen Sie ihn, wenn er abläuft. Diese Methode hat einen Nachteil: Wenn der Schlüssel nicht verwendet wird, bleibt er immer im Speicher. Tatsächlich ist er abgelaufen, was viel Platz verschwendet.
setnx in Redis unterstützt das Festlegen der Ablaufzeit nicht. Wenn Sie bei verteilten Sperren einen Deadlock vermeiden möchten, der durch eine bestimmte Client-Unterbrechung verursacht wird, müssen Sie die Ablaufzeit der Sperre festlegen. Bei hoher Parallelität können setnx und Expire keine atomaren Operationen implementieren. Wenn Sie es verwenden möchten, müssen Sie es explizit im Programmcode sperren. Die Verwendung von SET anstelle von SETNX ist gleichbedeutend damit, dass SETNX+EXPIRE Atomizität erreicht. Es besteht kein Grund zur Sorge, dass SETNX erfolgreich ist und EXPIRE fehlschlägt.
Die herkömmliche LRU verwendet einen Stapel und verschiebt jedes Mal die zuletzt verwendeten Daten an die Spitze des Stapels. Die Verwendung des Stapels führt jedoch dazu, dass eine große Menge nicht heißer Daten anfällt Besetzt den Kopf beim Ausführen von select * data und muss daher verbessert werden. Jedes Mal, wenn Redis einen Wert per Schlüssel erhält, aktualisiert es das LRU-Feld im Wert auf den aktuellen Zeitstempel der zweiten Ebene. Der anfängliche Implementierungsalgorithmus von Redis ist sehr einfach. Fünf Schlüssel werden zufällig aus dem Diktat entnommen und der Schlüssel mit dem kleinsten LRU-Feldwert wird eliminiert. In 3.0 wurde eine weitere Version des Algorithmus verbessert. Zunächst wird der erste zufällig ausgewählte Schlüssel in einen Pool gelegt (die Größe des Pools beträgt 16). Die Schlüssel im Pool sind in der Reihenfolge ihrer LRU-Größe angeordnet. Als nächstes muss jeder zufällig ausgewählte Keylru-Wert kleiner als der kleinste LRU im Pool sein, bevor er weiter hinzugefügt wird, bis der Pool voll ist. Nachdem er voll ist, muss jedes Mal, wenn ein neuer Schlüssel eingesteckt werden muss, der Schlüssel mit der größten LRU im Pool herausgenommen werden. Wählen Sie beim Eliminieren direkt einen minimalen LRU-Wert aus dem Pool aus und eliminieren Sie ihn.
Erfahrung nutzen, um Vorhersagen zu treffen: Wenn Sie beispielsweise den Beginn einer Aktivität im Voraus kennen, dann verwenden Sie diesen Schlüssel als Hotspot-Schlüssel.
Serverseitige Erfassung: Fügen Sie vor dem Betrieb von Redis eine Codezeile für die Datenstatistik hinzu.
Pakete zur Auswertung erfassen: Redis verwendet das TCP-Protokoll zur Kommunikation mit dem Client. Das Kommunikationsprotokoll verwendet RESP, sodass Sie Pakete auch zur Analyse abfangen können, indem Sie Ihr eigenes Programm zur Überwachung des Ports schreiben.
Auf der Proxy-Ebene wird jede Redis-Anfrage gesammelt und gemeldet.
Redis wird mit einer Befehlsabfrage geliefert: Die Version Redis 4.0.4 bietet redis-cli –hotkeys, um Hotkeys zu finden. (Wenn Sie den integrierten Befehl von Redis zum Abfragen verwenden möchten, beachten Sie bitte, dass Sie zuerst die Speicherräumungsrichtlinie auf allkeys-lfu oder volatile-lfu festlegen müssen, da sonst ein Fehler zurückgegeben wird. Geben Sie Redis ein und verwenden Sie den Konfigurationssatz maxmemory-policy allkeys-lfu. )
Serverseitiges Caching: Zwischenspeichern von Hotspot-Daten im Speicher des Servers (Verwenden Sie den Redis-eigenen Nachrichtenbenachrichtigungsmechanismus, um die Daten von Konsistenz von Redis und serverseitigen Hotspot-Schlüsseln: Wenn der Hotspot-Schlüssel aktualisiert wird, aktualisiert der Server ihn auch.
Backup des Hotspot-Schlüssels: Die Zufallszahl wird zufällig an andere Redis-Knoten verteilt. Auf diese Weise treffen sie beim Zugriff auf den Hotspot-Schlüssel nicht alle auf einen Computer.
Verwenden Sie die Redis-Hochverfügbarkeitsarchitektur: Verwenden Sie den Redis-Cluster, um sicherzustellen, dass der Redis-Dienst nicht hängen bleibt. Die Cache-Zeit ist inkonsistent. Fügen Sie einen Cache hinzu Ablaufzeit Zufällige Werte, um kollektive Fehler zu vermeiden
Aktuelle Begrenzungs-Downgrade-Strategie: Es gibt bestimmte Einreichungen. Wenn der personalisierte Empfehlungsdienst beispielsweise nicht verfügbar ist, ersetzen Sie ihn durch einen Hotspot-Datenempfehlungsdienst
Um die Effizienz sicherzustellen, speichert Redis Daten im Speicher zwischen, schreibt jedoch regelmäßig aktualisierte Daten auf die Festplatte oder schreibt Änderungsvorgänge in zusätzliche Datensatzdateien, um die Datenpersistenz sicherzustellen. Es gibt zwei Persistenzstrategien für Redis:
RDB: Das Snapshot-Formular besteht darin, die Daten im Speicher direkt in einer Dump-Datei zu speichern, sie regelmäßig zu speichern und die Strategie zu speichern. Wenn Redis beibehalten werden muss, teilt Redis einen untergeordneten Prozess auf und der untergeordnete Prozess schreibt die Daten in eine temporäre RDB-Datei auf der Festplatte. Wenn der untergeordnete Prozess das Schreiben der temporären Datei abgeschlossen hat, ersetzen Sie die ursprüngliche RDB.
AOF: Speichern Sie alle Befehle zum Ändern des Redis-Servers in einer Datei, einer Sammlung von Befehlen.
Verwenden Sie AOF für die Persistenz. Jeder Schreibbefehl wird über die Schreibfunktion an appendonly.aof angehängt. Die Standardrichtlinie von aof besteht darin, einmal pro Sekunde zu fsyncen, selbst wenn ein Fehler auftritt, gehen Daten bis zu einer Sekunde verloren. Der Nachteil besteht darin, dass für denselben Datensatz die Dateigröße von AOF normalerweise größer ist als die Größe von RDB-Dateien. Abhängig von der verwendeten fsync-Strategie ist AOF möglicherweise langsamer als RDB. Redis verwendet standardmäßig die Persistenzmethode von Snapshot RDB. Bei der Master-Slave-Synchronisierung wird die vollständige Synchronisierung (RDB) durchgeführt, wenn die Master-Slave-Verbindung gerade hergestellt ist. Nach Abschluss der vollständigen Synchronisierung wird die inkrementelle Synchronisierung (AOF) durchgeführt.
Das Wesentliche einer Redis-Transaktion ist eine Reihe von Befehlen. Transaktionen unterstützen die gleichzeitige Ausführung mehrerer Befehle und alle Befehle in einer Transaktion werden serialisiert. Während des Transaktionsausführungsprozesses werden die Befehle in der Warteschlange serialisiert und der Reihe nach ausgeführt, und von anderen Clients übermittelte Befehlsanforderungen werden nicht in die Befehlssequenz für die Transaktionsausführung eingefügt. Zusammenfassend lässt sich sagen: Eine Redis-Transaktion ist eine einmalige, sequentielle und exklusive Ausführung einer Reihe von Befehlen in einer Warteschlange.
Redis-Transaktionen verfügen nicht über das Konzept der Isolationsstufe. Der Stapelvorgang wird vor dem Senden des EXEC-Befehls in den Warteschlangencache gestellt und daher nicht tatsächlich ausgeführt der Transaktion. Außerhalb der Transaktion ist die Abfrage nicht sichtbar.
In Redis wird ein einzelner Befehl atomar ausgeführt, es ist jedoch nicht garantiert, dass Transaktionen atomar sind und es gibt kein Rollback. Wenn ein Befehl in der Transaktion nicht ausgeführt werden kann, werden die verbleibenden Befehle trotzdem ausgeführt.
watch key1 key2 ... : Überwachen Sie einen oder mehrere Schlüssel, bevor die Transaktion ausgeführt wird, wird die Transaktion unterbrochen (ähnlich wie Optimistische Sperre)
multi: Markiert den Beginn eines Transaktionsblocks (in der Warteschlange)
exec: Führen Sie die Befehle aller Transaktionsblöcke aus (sobald exec ausgeführt wird, werden die zuvor hinzugefügten Überwachungssperren aufgehoben)
verwerfen: Transaktion abbrechen, alle Befehle im Transaktionsblock verwerfen.
unwatch: Überwachung aller Schlüssel durch Watch abbrechen Speichern Sie alle Daten im Speicher, es bleibt nach einem Stromausfall hängen und die Daten dürfen die Speichergröße nicht überschreiten. Einige Daten in Redis werden auf der Festplatte gespeichert, was die Haltbarkeit der Daten gewährleistet.
Jeder Wachposten sendet regelmäßig Nachrichten an andere Wachposten, Master und Slaves, um zu bestätigen, ob die andere Partei am Leben ist. Wenn festgestellt wird, dass die andere Partei nicht innerhalb der angegebenen Zeit (konfigurierbar) geantwortet hat, wird dies vorübergehend berücksichtigt tot sein (der sogenannte „subjektive Glaube, dass die Maschine ausgefallen ist“).
Dieses progressive Rehash vermeidet die enorme Menge an Berechnungen und Speicheroperationen, die durch das zentralisierte Rehash verursacht werden. Es ist jedoch zu beachten, dass normale Zugriffsanforderungen beim Rehash von Redis möglicherweise zweimal auf die Hashtabelle zugreifen müssen (ht[0], ht[1]). Wenn der Schlüsselwert beispielsweise auf neue ht1 umgeleitet wird, müssen Sie zuerst auf ht0 zugreifen. Wenn er in ht0 nicht gefunden werden kann, gehen Sie zu ht1, um ihn zu finden.
Die Anzahl der in der Hash-Tabelle gespeicherten Schlüssel übersteigt die Größe der Hash-Tabelle.
Der Redis-Server führt derzeit den BGSAVE-Befehl (rdb.) nicht aus ) oder den BGREWRITEAOF-Befehl und der Auslastungsfaktor der Hash-Tabelle ist größer oder gleich 1.
Der Redis-Server führt derzeit den BGSAVE-Befehl (rdb) oder den BGREWRITEAOF-Befehl und den Auslastungsfaktor der Hash-Tabelle aus ist größer oder gleich 5. (Ladefaktor = gespeicherte Hash-Tabelle Anzahl der Knoten/Hash-Tabellengröße. Wenn der Ladefaktor der Hash-Tabelle kleiner als 0,1 ist, führen Sie einen Verkleinerungsvorgang für die Hash-Tabelle durch.)
Verteilte Sperre + Zeit. Klicken Sie auf
Verwenden Sie die Nachrichtenwarteschlange
Für Single-Threaded-Blocking-Redis kann die Pipeline Batch-Vorgänge erfüllen und kontinuierlich senden Senden Sie mehrere Befehle an den Redis-Server und analysieren Sie sie dann einzeln. Antwortergebnisse. Durch Pipelining kann die Leistung der Stapelverarbeitung verbessert werden. Der Hauptgrund für die Verbesserung besteht darin, dass die „Interaktions-Roundtrip“-Zeit in der TCP-Verbindung verkürzt wird. Die unterste Ebene der Pipeline besteht darin, alle Vorgänge in Streams zu kapseln, und Redis definiert seine eigenen eingehenden und ausgehenden Ausgabestreams. Führen Sie Vorgänge in der sync()-Methode aus. Jede Anfrage wird in die Warteschlange gestellt und das Antwortpaket wird analysiert.
Aktualisieren Sie zuerst die Datenbank und löschen Sie dann den Cache. Der Lesevorgang der Datenbank ist viel schneller als der Schreibvorgang, sodass fehlerhafte Daten nur schwer angezeigt werden. Sie können eine asynchrone Strategie zum verzögerten Löschen implementieren, um sicherzustellen, dass der Löschvorgang erst ausgeführt wird, wenn die Leseanforderung abgeschlossen ist.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmiervideos! !
Das obige ist der detaillierte Inhalt vonEine Zusammenfassung von mehr als 20 wichtigen Redis-Interviewfragen. Kommen Sie und sammeln Sie sie! !. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!