In diesem Artikel werden einige Interviewfragen zum Redis-Caching mit Ihnen geteilt. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Unterschied:
memcached kann Bilder und Videos zwischenspeichern. Redis unterstützt neben k/v noch weitere Datenstrukturen; .
Master-Slave-Replikationsimplementierung: Der Masterknoten erstellt einen Snapshot der Daten in seinem eigenen Speicher, sendet den Snapshot an den Slave-Knoten und der Slave-Knoten stellt die Daten im Speicher wieder her. Danach sendet der Master-Knoten jedes Mal, wenn neue Daten hinzugefügt werden, die Anweisung in einem binären Protokollformat ähnlich wie MySQL an den Slave-Knoten, und der Slave-Knoten erhält die vom Master-Knoten gesendete Anweisung zur Wiedergabe. +
Redis-Cluster-Körper Bietet die Möglichkeit, Daten automatisch auf verschiedene Knoten von RedisCluster zu verteilen. Auf welchem Knoten eine bestimmte Datenteilmenge der gesamten Datensammlung gespeichert ist, ist für den Benutzer transparent)Redis-Video-Tutorial
]3 Wie entwerfe ich verteilte Sperren mit Redis? Erzählen Sie mir von der Umsetzungsidee? Ist es möglich, zk zu verwenden? Wie erreichen? Was ist der Unterschied zwischen diesen beiden?
4. Kennen Sie die Beständigkeit von Redis? Wie wird die unterste Ebene implementiert? Was sind die Vor- und Nachteile?
bgsave sorgt für die vollständige Bildpersistenz und aof für die inkrementelle Persistenz. Da bgsave lange dauert und nicht in Echtzeit erfolgt, kommt es beim Herunterfahren zu großem Datenverlust. Beim Neustart der Redis-Instanz wird zuerst aof verwendet Da kein AOF-Protokoll vorhanden ist, wird die RDB-Datei zum Wiederherstellen verwendet. Redis schreibt AOF regelmäßig neu und komprimiert die Protokollgröße der AOF-Datei. Nach Redis 4.0 gibt es eine hybride Persistenzfunktion, die die volle Menge an bgsave und das Inkrement von aof integriert, was nicht nur die Effizienz der Wiederherstellung gewährleistet, sondern auch die Sicherheit der Daten berücksichtigt. Das Prinzip von bgsave, fork und cow, fork bedeutet, dass Redis den BGSave-Vorgang durch Erstellen eines untergeordneten Prozesses durchführt, und cow bedeutet, dass nach der Erstellung des untergeordneten Prozesses der übergeordnete und der untergeordnete Prozess das Datensegment gemeinsam nutzen und der übergeordnete Prozess damit fortfährt Bereitstellung von Lese- und Schreibdiensten und Schreiben schmutziger Seiten. Die Daten werden nach und nach vom untergeordneten Prozess getrennt.
Ablaufstrategie:
Zeitgesteuerter Ablauf (ein Schlüssel, ein Timer), verzögerter Ablauf: Nur wenn der Schlüssel verwendet wird, wird beurteilt, ob der Schlüssel abgelaufen ist, und er wird gelöscht, wenn er abläuft. Periodischer Ablauf: ein Kompromiss zwischen den ersten beiden.
LRU: newLinkedHashMap
LRU-Algorithmus-Implementierung:
wird durch eine bidirektionale verknüpfte Liste implementiert und neue Daten werden in den Kopf der verknüpften Liste eingefügt Liste;
Immer wenn der Cache erreicht wird (d. h. auf die zwischengespeicherten Daten wird zugegriffen), werden die Daten an den Kopf der verknüpften Liste verschoben.
Wenn die verknüpfte Liste voll ist, werden die Daten am Ende verworfen der verknüpften Liste.
LinkedHashMap: Die Kombination aus HashMap und doppelt verknüpfter Liste ist LinkedHashMap. HashMap ist ungeordnet und LinkedHashMap stellt die Iterationsreihenfolge sicher, indem es eine zusätzliche doppelt verknüpfte Liste verwaltet. Die Iterationsreihenfolge kann eine Einfügungsreihenfolge (Standard) oder eine Zugriffsreihenfolge sein.
** Cache-Penetration: ** bezieht sich auf die Abfrage von Daten, die nicht vorhanden sein dürfen. Wenn die Daten nicht auf der Speicherebene gefunden werden können, werden sie nicht in den Cache geschrieben Wird bei jeder Anforderung an die Datenbank gesendet. Die Abfrage kann dazu führen, dass die Datenbank hängen bleibt.
Lösung:
Die von der Abfrage zurückgegebenen Daten sind leer. Dieses leere Ergebnis wird immer noch zwischengespeichert, aber die Ablaufzeit ist kürzer.
Bloom-Filter: Hashen Sie alle möglichen Daten in einer Bitmap Wenn die Bitmap groß genug ist, werden Daten, die nicht vorhanden sein dürfen, von dieser Bitmap abgefangen, wodurch DB-Abfragen vermieden werden.
** Cache-Aufschlüsselung: ** Wenn bei einem Schlüssel mit festgelegter Ablaufzeit der Cache zu einem bestimmten Zeitpunkt abläuft, gibt es zu diesem Zeitpunkt zufällig eine große Anzahl gleichzeitiger Anforderungen für diesen Schlüssel. Diese Anforderungen stellen im Allgemeinen fest, dass der Cache abgelaufen ist. Daten werden aus der Backend-Datenbank geladen und im Cache wiederhergestellt. Zu diesem Zeitpunkt können große gleichzeitige Anforderungen die Datenbank sofort überlasten.
Lösung:
Mutex-Sperre verwenden: Wenn der Cache fehlschlägt, gehen Sie nicht sofort zu Ioaddb, z. B. Redis, um eine Mutex-Sperre festzulegen. Wenn der Vorgang erfolgreich ist, führen Sie den Ioaddb-Vorgang aus und legen Sie ihn fest Zurück. Andernfalls versuchen Sie es erneut mit der Get-Cache-Methode.
Läuft nie ab: Physisch läuft nicht ab, aber Logik läuft ab (asynchrone Thread-Aktualisierungen im Hintergrund). Cache-Lawine: Beim Festlegen des Caches wird dieselbe Ablaufzeit verwendet, wodurch der Cache zu einem bestimmten Zeitpunkt gleichzeitig abläuft, alle Anforderungen an die Datenbank weitergeleitet werden und die Datenbank sofort unter Druck steht und eine Lawine verursacht. Der Unterschied zur Cache-Aufschlüsselung: Bei Avalanche handelt es sich um viele Schlüssel, bei der Aufschlüsselung um einen bestimmten Schlüssel-Cache.
Lösung:
Verteilen Sie die Cache-Ablaufzeit. Sie können beispielsweise einen zufälligen Wert zur ursprünglichen Ablaufzeit hinzufügen, z. B. 1–5 Minuten, sodass die Wiederholungsrate jeder Cache-Ablaufzeit reduziert wird . Es ist schwierig, kollektive Fehlerereignisse zu verursachen.
Die Speicherzuweisung von Memcache übernimmt die Verwaltungsmethode eines vorab zugewiesenen Speicherpools, wodurch Zeit für die Speicherzuweisung eingespart werden kann, was zu einer Fragmentierung führen kann.
Mit dem virtuellen Speicher speichert Memcache alle Daten im physischen Speicher, der theoretisch mehr Daten als den physischen Speicher speichern kann Ab diesem Zeitpunkt ist Memcache bei großen Datenmengen schneller. Das Netzwerkmodell verwendet ein nicht blockierendes 10-Wiederverwendungsmodell, und Redis verwendet auch nicht blockierendes I. Wiederverwendungsmodell, aber Redis bietet neben dem KV-Speicher auch einige Sortier- und Aggregationsfunktionen und komplexe CPU-Berechnungen, die die gesamte I0-Planung blockieren. Aus dieser Sicht ist Memcache schneller, da Redis mehr Funktionen bereitstellt Modell verwendet Memcache Multithreading, der Haupt-Thread lauscht und die Worker-Sub-Threads akzeptieren Anforderungen und führen Lese- und Schreibvorgänge aus. In diesem Prozess kann es zu Sperrkonflikten kommen. Obwohl der von Redis verwendete einzelne Thread keinen Sperrkonflikt aufweist, ist es schwierig, die Eigenschaften von Multi-Core zu nutzen, um den Durchsatz zu verbessern.
Angenommen, der Hauptspeicher ist getrennt und die Lese-/Schreib-getrennte Datenbank wird übernommen.
Wenn ein Thread A zuerst die zwischengespeicherten Daten löscht und die Daten dann in die Hauptbibliothek schreibt, erfolgt zu diesem Zeitpunkt die Synchronisierung zwischen der Hauptbibliothek und die Slave-Bibliothek ist nicht abgeschlossen. Das Lesen von Daten aus dem Cache schlägt fehl. Die alten Daten werden aus der Slave-Bibliothek gelesen und dann im Cache aktualisiert.9. Wie kann die Inkonsistenz zwischen Master- und Slave-Datenbanken gelöst werden?
Szenariobeschreibung: Bei der Master-Slave-Bibliothek sind Lesen und Schreiben getrennt. Wenn es bei der Aktualisierungssynchronisierung der Master-Slave-Bibliothek zu einer Inkonsistenz kommt
Zwangsweise Lesen und Schreiben der Hauptbibliothek Fügen Sie in der Hauptbibliothek einen Cache hinzu, um die Leistung beim Datenlesen zu verbessern.
Lesen Sie selektiv die Hauptbibliothek, fügen Sie einen Cache hinzu, um die Daten aufzuzeichnen, die aus der Hauptbibliothek gelesen werden müssen, verwenden Sie welche Bibliothek, welche Tabelle und welchen Primärschlüssel als Cache-Schlüssel und legen Sie die Cache-Ablaufzeit für die Synchronisierung fest Wenn sich diese Daten im Cache befinden, lesen Sie sie direkt aus der Hauptbibliothek. Wenn kein solcher Primärschlüssel im Cache vorhanden ist, lesen Sie sie aus der entsprechenden Slave-Bibliothek.
Vermeiden Sie das Hinzufügen von Slave-Bibliotheken zur überlasteten Master-Bibliothek.
Verwenden Sie keine Mesh-Struktur für die Master-Slave-Replikation, sondern versuchen Sie, eine lineare Struktur zu verwenden, Master<–Slave1<-Slave2…
12 Welche Datenstrukturen gibt es in Redis? Wenn Sie ein Benutzer der ersten Ebene sind, gibt es weitere. Wenn Sie ein fortgeschrittener oder fortgeschrittener Redis-Benutzer sind, müssen Sie außerdem die folgenden Datenstrukturen hinzufügen: HyperLogLog, Geo und Pub/Sub.
Die andere Partei fragte dann: Wenn dieser Redis Dienste für Online-Unternehmen bereitstellt, welche Probleme gibt es bei der Verwendung des Tastenbefehls?
Zu diesem Zeitpunkt müssen Sie eine Schlüsselfunktion von Redis beantworten: das Single-Threading von Redis. Die Schlüsselanweisung führt dazu, dass der Thread für einen bestimmten Zeitraum blockiert wird und der Onlinedienst angehalten wird. Der Dienst kann erst wiederhergestellt werden, wenn die Anweisung ausgeführt wird. Zu diesem Zeitpunkt können Sie den Scan-Befehl verwenden, um die Schlüsselliste des angegebenen Modus zu extrahieren, es besteht jedoch eine gewisse Wahrscheinlichkeit einer Duplizierung. Führen Sie dies jedoch nur einmal auf dem Client aus, dies wird jedoch insgesamt der Fall sein länger sein als die direkte Verwendung. Der Tastenbefehl ist lang.
Verwenden Sie den Listentyp, um Nachrichten zu speichern, und wenn lpop keine Nachrichten hat, können Sie schlafen Wenn Sie nicht schlafen möchten, können Sie blpop für einen bestimmten Zeitraum verwenden und dann prüfen, ob Informationen vorhanden sind. Redis kann über das Pub/Sub-Topic-Abonnementmodell einen Produzenten und mehrere Konsumenten implementieren. Natürlich gibt es bestimmte Nachteile, wenn der Konsument offline geht.
Verwenden Sie sortiertes Set, verwenden Sie Zeitstempel als Bewertung, Nachrichteninhalt als Schlüssel, rufen Sie zadd auf, um Nachrichten zu erstellen, und Verbraucher verwenden zrangbyscore, um Daten vor n Sekunden für die Abfrageverarbeitung abzurufen.
Redis ist im Wesentlichen eine In-Memory-Datenbank vom Typ Schlüsselwert, ähnlich wie Memcached. Die gesamte Datenbank wird für den Betrieb in den Speicher geladen und die Datenbankdaten werden regelmäßig durch asynchrone Vorgänge auf die Festplatte geleert .
Da es sich um eine reine Speicheroperation handelt, ist die Leistung von Redis sehr gut, es kann mehr als 100.000 Lese- und Schreibvorgänge pro Sekunde verarbeiten und ist die schnellste bekannte Key-ValueDB.
Die Exzellenz von Redis liegt nicht nur in der Leistung. Der größte Vorteil von Redis besteht darin, dass es das Speichern einer Vielzahl von Datenstrukturen unterstützt. Darüber hinaus beträgt die maximale Grenze eines einzelnen Werts 1 GB, im Gegensatz zu Memcached, das nur 1 MB an Daten speichern kann. Daher können mit Redis viele nützliche Funktionen erreicht werden.
Speicher.
allkeys-lru: versucht dies Recyceln Sie den am wenigsten verwendeten Schlüssel (LRU), damit neu hinzugefügte Daten Platz zum Speichern haben.
volatile-random: Zufallsschlüssel recyceln, sodass neu hinzugefügte Daten Platz zum Speichern haben, jedoch nur für Schlüssel im abgelaufenen Satz.
Da die aktuelle Linux-Version recht stabil ist und eine große Anzahl von Benutzern hat, besteht keine Notwendigkeit, eine Windows-Version zu entwickeln, was zu Kompatibilitäts- und anderen Problemen führen würde.
23. Was ist die maximale Kapazität, die ein String-Typ-Wert speichern kann?512M
24. Warum muss Redis alle Daten im Speicher ablegen?Redis zeichnet sich also durch hohe Geschwindigkeit und Datenpersistenz aus. Wenn die Daten nicht im Speicher abgelegt werden, beeinträchtigt die E/A-Geschwindigkeit der Festplatte die Leistung von Redis erheblich.
Auf der Geschäftscodeebene implementiert, werden mehrere unabhängige Redis-Instanzen erstellt. Auf der Codeebene wird die Hash-Berechnung für den Schlüssel durchgeführt und dann die entsprechende Redis-Instanz zum Betrieb der Daten verwendet. Diese Methode stellt relativ hohe Anforderungen an den Hash-Layer-Code. Zu den Überlegungen gehören alternative Algorithmuslösungen nach einem Knotenausfall, die automatische Skriptwiederherstellung nach einem Datenschock, die Instanzüberwachung usw.
Wenn in einem Cluster mit drei Knoten A, B und C ohne Replikationsmodell Knoten B ausfällt, geht der gesamte Cluster davon aus, dass ihm Steckplätze im Bereich von 5501–11000 fehlen und er nicht verfügbar ist.
Wenn die Größe des Redis-Speicherdatensatzes auf eine bestimmte Größe ansteigt, wird die Dateneliminierungsstrategie implementiert.
Sitzungscache
Eines der am häufigsten verwendeten Szenarien für die Verwendung von Redis ist der Sitzungscache. Der Vorteil der Verwendung von Redis zum Zwischenspeichern von Sitzungen gegenüber anderem Speicher (z. B. Memcached) besteht darin, dass Redis Persistenz bietet. Bei der Pflege eines Caches, der nicht unbedingt Konsistenz erfordert, wären die meisten Menschen unzufrieden, wenn alle Warenkorbinformationen des Benutzers verloren gehen würden. Wäre das dann immer noch der Fall?
Da sich Redis im Laufe der Jahre verbessert hat, ist es glücklicherweise leicht herauszufinden, wie man Redis richtig zum Zwischenspeichern von Sitzungsdokumenten verwendet. Auch die bekannte kommerzielle Plattform Magento stellt Redis-Plug-ins zur Verfügung.
Nehmen wir noch einmal Magento als Beispiel: Magento bietet ein Plugin zur Verwendung von Redis als Full-Page-Cache-Backend.
Darüber hinaus verfügt Pantheon für WordPress-Benutzer über ein sehr gutes Plug-in wp-redis, mit dem Sie die von Ihnen durchsuchten Seiten so schnell wie möglich laden können.
Wenn Sie in Google schnell nach „Redisqueues“ suchen, werden Sie sofort auf eine große Anzahl von Open-Source-Projekten stoßen. Der Zweck dieser Projekte besteht darin, mit Redis sehr gute Back-End-Tools zu erstellen, um verschiedene Warteschlangenanforderungen zu erfüllen. Celery verfügt beispielsweise über ein Backend, das Redis als Broker verwendet. Sie können es hier anzeigen.
Leaderboard/Counter
Redis implementiert den Vorgang des Erhöhens oder Verringerns von Zahlen im Speicher sehr gut. Mengen (Sets) und geordnete Mengen (SortedSet) machen es uns auch sehr einfach, diese Operationen durchzuführen. Redis stellt lediglich diese beiden Datenstrukturen bereit. Wir möchten also die Top 10 Benutzer aus der sortierten Menge erhalten – nennen wir sie „user_scores“, wir müssen es nur so machen:
Dies setzt natürlich voraus, dass Sie nach Ihren Benutzerbewertungen sortiert sind in aufsteigender Reihenfolge. Wenn Sie den Benutzer und die Punktzahl des Benutzers zurückgeben möchten, müssen Sie dies wie folgt ausführen:
ZRANGEuser_scores010WITHSCORES
AgoraGames ist ein gutes Beispiel, implementiert in Ruby, und seine Bestenliste verwendet Redis zum Speichern von Daten. Sie können es hier sehen.
Redisson, Jedis, Salat usw., die offizielle Empfehlung lautet Redisson.
Redisson ist ein erweiterter Redis-Client für die verteilte Koordination, der Benutzern dabei helfen kann, einige Java-Objekte (Bloomfilter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap usw.) einfach in einer verteilten Umgebung zu implementieren , BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish/Subscribe, HyperLogLog).
Jedis ist ein von Redis in Java implementierter Client.
Redisson implementiert verteilte und skalierbare Java-Datenstrukturen. Seine Funktionen sind einfacher und unterstützen keine String-Operationen Redis-Funktionen wie Sortierung, Transaktionen, Pipelines und Partitionen. Der Zweck von Redisson besteht darin, die Trennung der Benutzeranliegen von Redis zu fördern, sodass sich Benutzer mehr auf die Verarbeitung der Geschäftslogik konzentrieren können.
Passwort festlegen: Konfigurationssatz erfordert Pass 123456 Autorisierungspasswort: auth123456
Der Redis-Cluster verwendet kein konsistentes Hashing, sondern führt das Konzept der Hash-Slots ein. Jeder Schlüssel besteht die CRC16-Prüfung und Modulo 16384, um zu bestimmen, welcher Slot platziert werden soll für einen Teil der Hash-Slots.
Um den Cluster weiterhin verfügbar zu machen, wenn einige Knoten ausfallen oder die meisten Knoten nicht kommunizieren können, verwendet der Cluster ein Master-Slave-Replikationsmodell und jeder Knoten verfügt über N-1-Replikate
Redis garantiert keine starke Datenkonsistenz, was bedeutet, dass der Cluster in der Praxis unter bestimmten Bedingungen Schreibvorgänge verlieren kann.
Asynchrone Replikation
16384.
Der Redis-Cluster kann derzeit keine Datenbank auswählen und ist standardmäßig auf Datenbank 0 eingestellt.
ping
Ein Request/Response-Server kann neue Anfragen bearbeiten, auch wenn auf alte Anfragen noch nicht geantwortet wurde. Dadurch ist es möglich, mehrere Befehle an den Server zu senden, ohne auf eine Antwort warten zu müssen, und diese Antwort schließlich in einem Schritt zu lesen.
Das ist Pipelining, eine Technik, die seit Jahrzehnten weit verbreitet ist. Beispielsweise unterstützen viele POP3-Protokolle diese Funktion, was den Download neuer E-Mails vom Server erheblich beschleunigt.
Eine Transaktion ist ein einzelner isolierter Vorgang: Alle Befehle in der Transaktion werden serialisiert und der Reihe nach ausgeführt. Während der Ausführung der Transaktion wird diese nicht durch Befehlsanfragen anderer Clients unterbrochen. Eine Transaktion ist eine atomare Operation: Entweder werden alle Befehle in der Transaktion ausgeführt, oder keiner von ihnen wird ausgeführt.
MULTI, EXEC, DISCARD, WATCH
EXPIRE- und PERSIST-Befehle.
Verwenden Sie so viele Hashes wie möglich. Eine Hash-Tabelle (d. h. die in einer Hash-Tabelle gespeicherte Zahl ist klein) benötigt sehr wenig Speicher, daher sollten Sie Ihr Datenmodell so weit wie möglich in eine Hash-Tabelle abstrahieren. Wenn in Ihrem Websystem beispielsweise ein Benutzerobjekt vorhanden ist, legen Sie keinen separaten Schlüssel für den Namen, den Nachnamen, die E-Mail-Adresse und das Passwort des Benutzers fest. Speichern Sie stattdessen alle Informationen des Benutzers in einer Hash-Tabelle.
Ein Client hat einen neuen Befehl ausgeführt und neue Daten hinzugefügt.
Redi prüft die Speichernutzung, wenn sie größer als das Limit von maxmemory ist, wird sie gemäß der festgelegten Strategie recycelt. Ein neuer Befehl wird ausgeführt usw.
Wir überschreiten also ständig die Grenze der Speichergrenze, indem wir ständig die Grenze erreichen und dann ständig unterhalb der Grenze wieder recyceln.
Wenn das Ergebnis eines Befehls dazu führt, dass viel Speicher beansprucht wird (z. B. das Speichern der Schnittmenge einer großen Menge in einem neuen Schlüssel), dauert es nicht lange, bis das Speicherlimit durch diese Speichernutzung überschritten wird .
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmiervideos! !
Das obige ist der detaillierte Inhalt vonFassen Sie einige Interviewfragen zum Redis-Cache zusammen und teilen Sie sie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!